C#使用具有泛型属性的反射
本文关键字:属性 反射 泛型 | 更新日期: 2023-09-27 18:28:58
我有一个使用泛型属性的类。例如:
class Person
{
public MyGenericProperty<string> Field1
{
get { return field1; }
set { field1 = value; }
}
private MyGenericProperty<string> field1= new MyInheritedGenericProperty<string>("Alan1");
}
我想在另一个类中使用这个类和反射,我有一个类似的方法
public void DoSomethingWithProperty(object sourceobject)
{
foreach (var aProperty in sourceobject.GetType().GetProperties())
{
*if(aProperty.PropertyType == typeof(MyGenericProperty<>))*
{
*var obj = (MyGenericProperty<>)aProperty.GetValue(sourceobject, null);*
}
}
return null;
}
我有两个问题
1-如何进行泛型属性的类型检查。在该示例中,if(aProperty.PropertyType == typeof(MyGenericProperty<>))
的代码不起作用。
MyGenericProperty的2-T可以是任何类,如何在不知道反射T为的情况下强制转换MyGenericProperties类
var obj = (MyGenericProperty<>)aProperty.GetValue(sourceobject, null);
感谢您的帮助。
首先,重要的是要理解您没有"泛型属性"——根本没有这样的东西。您有一个类型为泛型类型的属性。。。这不是一回事。(将其与泛型类型或泛型方法进行比较,就引入新的类型参数而言,每种方法都是真正的泛型。)
您可以使用以下代码进行测试:
if (aProperty.PropertyType.IsGenericType &&
aProperty.GetGenericTypeDefinition() == typeof(MyGenericProperty<>))
但至于选角,这取决于你之后想对价值做什么。您可能需要声明MyGenericProperty<>
的非泛型基类型,该基类型包含不依赖于类型参数的所有成员。我通常会给它与泛型类型(例如MyGenericProperty
)相同的名称,只是不给它类型参数。然后,如果你只需要其中一个成员,你可以使用:
if (aProperty.PropertyType.IsGenericType &&
aProperty.GetGenericTypeDefinition() == typeof(MyGenericProperty<>))
{
var value = (MyGenericProperty) aProperty.GetValue(sourceObject, null);
// Use value
}
但在这种情况下,无论如何都可以使用Type.IsAssignableFrom
:
if (typeof(MyGenericProperty).IsAssignableFrom(aProperty.PropertyType))
{
var value = (MyGenericProperty) aProperty.GetValue(sourceObject, null);
// Use value
}
如果这些提示对您没有帮助,请提供您尝试做什么的更多详细信息。