在没有对象的情况下从PropertyInfo获取值

时间:2018-10-23 10:52:37

标签: c# reflection

我正在使用反射从程序集中获取所有修饰符类型,并将它们放入字典中。

我想看看修饰符的内容。每个NodeContent具有使它们与修饰符匹配的接口。每个修饰符都有一个抽象属性GetContentType,该属性返回一个接口类型以显示其可以接受的内容。

但是这迫使我创建一个使用PropertyInfo.GetValue()的类型的对象,该对象违背了我要执行的操作,因为我不知道它需要什么内容类型。

我认为我只能得到第一个构造函数和第一个参数,但是对我来说并不安全。

所以我的问题是。是否有另一种不使用对象而仅使用类型来获取PropertyInfo.GetValue()的方法?

public static Dictionary<string, Type> GetFittingModifiers(NodeContent content)
{
    Dictionary<string, Type> fits = new Dictionary<string, Type>();
    foreach(KeyValuePair<string,Type> modifierType in modifiers)
    {
        PropertyInfo propertyInfo = modifierType.Value.GetProperty("GetContentType");
        Modifier modifier = //make object of modifierType.Value without knowing what the constructor takes
        Type contentType = (Type)propertyInfo.GetValue(modifier, null);
        if (HasInterface(content, contentType))
            fits.Add(modifierType.Key, modifierType.Value);
    }
    return fits;
}

1 个答案:

答案 0 :(得分:1)

不是任何干净的方式。

要获取实例属性的值,您需要调用accessor方法。该方法将this作为参数。即使不是严格 require ,参数也存在。另外,要使这项工作全部完成,该属性必须是虚拟的,这再次意味着您需要特定类型的实例来调用正确的方法。您可以伪造它,但听起来您的设计很糟糕,现在您需要快速修复。

将类型信息与任何类型的值相关联的最简单方法是通过属性。因此,您将定义一个GetContentType而不是使用ContentTypeAttribute虚拟属性,然后将其应用于目标类型:

[ContentType(typeof(SomePlug))]
public class SomeModifier { ... }

属性适用于类型,而不是类型的实例,因此您可以轻松查询它们:

var contentType = Attribute.GetCustomAttribute(modifier, typeof(ContentTypeAttribute));