我正在使用反射从程序集中获取所有修饰符类型,并将它们放入字典中。
我想看看修饰符的内容。每个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;
}
答案 0 :(得分:1)
不是任何干净的方式。
要获取实例属性的值,您需要调用accessor方法。该方法将this
作为参数。即使不是严格 require ,参数也存在。另外,要使这项工作全部完成,该属性必须是虚拟的,这再次意味着您需要特定类型的实例来调用正确的方法。您可以伪造它,但听起来您的设计很糟糕,现在您需要快速修复。
将类型信息与任何类型的值相关联的最简单方法是通过属性。因此,您将定义一个GetContentType
而不是使用ContentTypeAttribute
虚拟属性,然后将其应用于目标类型:
[ContentType(typeof(SomePlug))]
public class SomeModifier { ... }
属性适用于类型,而不是类型的实例,因此您可以轻松查询它们:
var contentType = Attribute.GetCustomAttribute(modifier, typeof(ContentTypeAttribute));