English 中文(简体)
C# 带有属性的反射设置属性值
原标题:
  • 时间:2008-12-24 01:43:04
  •  标签:

我正在尝试通过类属性上的属性来构建一个对象,该属性指定一个提供的数据行中作为该属性值的列,如下:

    [StoredDataValue("guid")]
    public string Guid { get; protected set; }

    [StoredDataValue("PrograGuid")]
    public string ProgramGuid { get; protected set; }

在基对象上的Build()方法中,我正在获取设置在这些属性上的属性值。

        MemberInfo info = GetType();
        object[] properties = info.GetCustomAttributes(true);

然而,此刻我意识到我的知识有限。

首先,我似乎没有得到正确的属性返回。

现在我有了这些属性,我该如何通过反射设置它们?我是在做/思考一些根本上不正确的事情吗?

最佳回答

这里有几个不同的问题。

  • typeof(MyClass).GetCustomAttributes(bool)(或GetType().GetCustomAttributes(bool))返回的是类本身的属性,而不是成员的属性。您需要调用typeof(MyClass).GetProperties()来获取该类中属性的列表,然后逐个检查它们。

  • 一旦你获得了属性,我认为你应该使用 Attribute.GetCustomAttribute() 而不是 MemberInfo.GetGustomAttributes(),因为你清楚地知道你要查找哪个属性。

这是一个小片段的代码,帮助您开始:

PropertyInfo[] properties = typeof(MyClass).GetProperties();
foreach(PropertyInfo property in properties)
{
    StoredDataValueAttribute attribute =
        Attribute.GetCustomAttribute(property, typeof(StoredDataValueAttribute)) as StoredDataValueAttribute;

    if (attribute != null) // This property has a StoredDataValueAttribute
    {
         property.SetValue(instanceOfMyClass, attribute.DataValue, null); // null means no indexes
    }
}

编辑:不要忘记Type.GetProperties()默认只返回公共属性。您必须使用Type.GetProperties(BindingFlags)才能获得其他类型的属性。

问题回答

暂无回答




相关问题
热门标签