通过特定属性过滤类实例的属性并调用属性的方法

时间:2012-09-04 14:01:20

标签: c# reflection

我有一个包含一些属性的类。某些特定属性使用属性进行修饰。例如:

public class CoreAddress
{
    private ContactStringProperty _LastName;

    [ChangeRequestField]
    public ContactStringProperty LastName
    {
        //ContactStringProperty has a method SameValueAs(ContactStringProperty other)
        get { return this._LastName; }
    }
    .....
}

我希望在我的类中有一个方法,它遍历此类的所有属性,过滤具有此自定义属性的方法并调用找到的属性的成员。这就是我到目前为止所做的:

foreach (var p in this.GetType().GetProperties())
        {
            //checking if it's a change request field
            if (p.GetCustomAttributes(typeof(ChangeRequestFieldAttribute), false).Count() > 0)
            {

                MethodInfo method = p.PropertyType.GetMethod("SameValueAs");
                //problem here        
                var res = method.Invoke(null, new object[] { other.LastName }); 

            }

        }

如果此方法是属性的实例方法,则必须提供目标(而不是代码中的null)。如何在运行时获取此类实例的特定属性?

3 个答案:

答案 0 :(得分:1)

由于您已拥有PropertyInfo,因此可以调用GetValue method。所以......

MethodInfo method = p.PropertyType.GetMethod("SameValueAs");
//problem solved
var propValue = p.GetValue(this);

var res = method.Invoke(propValue, new object[] { other.LastName });

答案 1 :(得分:0)

使用PropertyInfo获取您需要的任何属性的值。

答案 2 :(得分:0)

只需从属性中获取值,并像平常一样使用它。

foreach (var p in type.GetProperties())
{
         if (p.GetCustomAttributes(typeof(ChangeRequestFieldAttribute), false).Count() > 0)
         {

               //just get the value of the property & cast it.
               var propertyValue = p.GetValue(<the instance>, null);
               if (propertyValue !=null && propertyValue is ContactStringProperty)
               {
                   var contactString = (ContactStringProperty)property;
                   contactString.SameValueAs(...);
               }
         }
  }