如果我有一个PropertyInfo和带有此扩展变量的对象,我可以调用扩展方法吗?

时间:2015-12-16 16:08:39

标签: c# .net reflection enums propertyinfo

如果我有一个propertyInfo和带有此扩展名的变量的对象,我可以调用扩展方法吗?

我有一个扩展名:

public static string GetTitle(this MyEnum myEnum)
{
    switch (myEnum)
    {
        case MyEnum.One:
            return "one";
        case MyEnum.Two:
            return "two";
        default:
            return "zero";
    }
}

和枚举:

public enum MyEnum
{
  Zero, One, Two
}

和班级

public class MyClass
{
   public string A {get;set;}
   public MyEnum B {get;set;}
}

当我得到这个类的PropertyInfo时,我需要调用一个扩展名。 我试着这样做

// .....
foreach(var prop in properties){
 var value = prop.GetType().IsEnum ? prop.GetTitle() : prop.GetValue(myObj, null).ToString()
 }
// .....

但它没有用。

我有几个不同的枚举和几个不同的扩展名。无论类型如何,我都会尝试获取值。

1 个答案:

答案 0 :(得分:2)

我的大学是正确的,问题的代码是完全错误的。 prop是PropertyInfo对象,然后是

prop.GetType().IsEnum

将始终返回false。

首先,您应该将此检查更改为

prop.GetValue(myObj, null).GetType().IsEnum

然后你可以像简单的静态方法一样调用扩展方法:

YourClassWithExtensionMethod.GetTitle((MyEnum)prop.GetValue(myObj, null))

完整的解决方案看起来像下一个代码:

foreach(var prop in properties)
{
    var value = prop.GetValue(myObj, null).GetType().IsEnum ? YourClassWithExtensionMethod.GetTitle((MyEnum)prop.GetValue(myObj, null)) : prop.GetValue(myObj, null).ToString()
}

但是你应该确保你的属性值实际上转换为MyEnum。最后我们将添加新的检查:

foreach(var prop in properties)
{
    var value = prop.GetValue(myObj, null).GetType().IsEnum ? (prop.GetValue(myObj, null) is MyEnum ?  YourClassWithExtensionMethod.GetTitle((MyEnum)prop.GetValue(myObj, null)) : ProcessGenericEnum(prop.GetValue(myObj, null)) ) : prop.GetValue(myObj, null).ToString()
}

现在你几乎不应该优化这行代码。仅检索一次值并分离两个条件。

foreach(var prop in properties)
{
    var propertyValue = prop.GetValue(myObj, null);
    if(propertyValue != null)
    {
        var value = propertyValue.GetType().IsEnum
            ? (propertyValue is MyEnum
                ? YourClassWithExtensionMethod.GetTitle((MyEnum) propertyValue)
                : ProcessGenericEnum(propertyValue))
            : propertyValue.ToString();
    }
}

干得好!