gpt4 book ai didi

C# Buddy 类/元数据和反射

转载 作者:太空狗 更新时间:2023-10-29 22:55:55 25 4
gpt4 key购买 nike

我正在尝试使用反射来检查给定类的属性是否设置了 ReadOnly 属性。我使用的类是 MVC View 模型(使用部分“伙伴”类作为元数据。

 public partial class AccountViewModel  
{
public virtual Int32 ID { get; set; }
public virtual decimal Balance { get; set; }

}
[MetadataType(typeof(AccountViewModelMetaData))]
public partial class AccountViewModel
{
class AccountViewModelMetaData
{
[DisplayName("ID")]
public virtual Int32 ID { get; set; }

[DisplayName("Balance")]
[DataType(DataType.Currency)]
[ReadOnly(true)]
public virtual decimal Balance { get; set; }

}
}

我想检查“Balance”是否具有 ReadOnly 属性。如果我在 AccountViewModel 的 Balance 属性上设置 ReadOnly 属性,我可以通过这种方式检索它:

Type t = typeof(AccountViewModel);
PropertyInfo pi = t.GetProperty("Balance");
bool isReadOnly = ReadOnlyAttribute.IsDefined(pi,typeof( ReadOnlyAttribute);

如果属性信息位于元数据类中,我将无法检索它。我如何检查属性是否存在?我为所有 View 模型定义了元数据类,并且需要一种通用方法来检查元数据类的属性。

有什么建议吗?

最佳答案

解决方案是使用 GetCustomAttributes 获取元数据类型并检查这些类型的属性...

Type t = typeof(MyClass);
PropertyInfo pi = t.GetProperty(PropertyName);
bool isReadOnly = ReadOnlyAttribute.IsDefined(pi, typeof(ReadOnlyAttribute));

if (!isReadOnly)
{
//check for meta data class.
MetadataTypeAttribute[] metaAttr = (MetadataTypeAttribute[])t.GetCustomAttributes(typeof(MetadataTypeAttribute),true);

if (metaAttr.Length > 0)
{
foreach (MetadataTypeAttribute attr in metaAttr)
{
t = attr.MetadataClassType;
pi = t.GetProperty(PropertyName);

if (pi != null) isReadOnly = ReadOnlyAttribute.IsDefined(pi, typeof(ReadOnlyAttribute));

if (isReadOnly) break;
}
}
}

关于C# Buddy 类/元数据和反射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2364610/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com