C# 从不带对象的PropertyInfo获取值

C# 从不带对象的PropertyInfo获取值,c#,reflection,C#,Reflection,我使用反射从程序集中获取所有修饰符类型,并将它们放入字典中 我想看看修改器采用了什么内容。每个NodeContent都有接口将其与修改器匹配。每个修饰符都有一个抽象属性GetContentType,它返回一个接口类型,以显示它可以接受的内容 但它迫使我创建一个类型为PropertyInfo.GetValue()的对象,这违背了我的意图,因为我不知道它采用什么内容类型 我假设我可以得到第一个构造函数和第一个参数,但这对我来说并不安全 所以我的问题是。有没有其他方法可以在不使用对象而仅使用类型的情况

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

我想看看修改器采用了什么内容。每个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;
}
publicstaticdictionary GetFittingModifiers(NodeContent内容)
{
Dictionary fits=新字典();
foreach(KeyValuePair修饰符输入修饰符)
{
PropertyInfo PropertyInfo=modifierType.Value.GetProperty(“GetContentType”);
修饰符修饰符=//使对象成为修饰符类型.Value,而不知道构造函数采用什么
类型contentType=(类型)propertyInfo.GetValue(修饰符,null);
if(HasInterface(内容、内容类型))
fits.Add(modifierType.Key,modifierType.Value);
}
回位配合;
}
不干净

要获取实例属性的值,需要调用访问器方法。该方法将
this
作为参数。即使它没有严格要求,争论仍然存在。此外,要使此工作正常,属性必须是虚拟的,这同样意味着您需要特定类型的实例来调用正确的方法。你可以假装这样,但听起来你的设计很糟糕,现在你需要找到一个快速修复方法

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

[ContentType(typeof(SomePlug))]
public class SomeModifier { ... }
属性应用于类型,而不是类型的实例,因此您可以轻松地查询它们:

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

PropertyInfo.GetValue
检索属性的值,这显然需要一个对象(对于非静态属性)。您似乎想要
PropertyInfo.PropertyType
。(我认为,这个问题对我来说并不完全清楚。)当然,这只会得到静态(声明)类型的属性;同样,如果不实际创建一个对象(或通过反射伪解释代码,但这可能会导致您走上非常黑暗的道路),那么获取属性值的运行时类型是不可能的。我想得到这个值。该值指示修饰符所采用的内容类型。“有没有其他方法可以不使用对象而仅使用类型来获取PropertyInfo.GetValue()?-没有,因为它是一个实例属性,所以需要一个实例。请创建一个。你可能需要重新考虑整个设计。然后,是的,对构造函数进行反思(并且强制执行它只需要一个你想要的类型的参数)看起来是唯一的方法,这很难看。考虑通过属性来公开类型,而不是代码> [CordNoType(…)] < /代码> -这些设计被设计成易于用反射来检查。或者,对于所有实例,将属性设置为静态,并使一个修饰符类型仅处理一种内容类型。(但即使这样,属性也可能更干净。)是的,杰伦·莫斯特,我想这就是我要寻找的答案!