作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个使用通用属性的类。例如:
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<>))
的示例代码中不起作用。
2- MyGenericProperty 的 T 可以是任何类,如何在不知道 T 的情况下通过反射将 MyGenericProperty 类转换为
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
}
如果这些提示对您没有帮助,请详细说明您要做什么。
关于C# 将反射与泛型属性结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18420250/
我是一名优秀的程序员,十分优秀!