gpt4 book ai didi

C# 将反射与泛型属性结合使用

转载 作者:行者123 更新时间:2023-11-30 13:58:06 27 4
gpt4 key购买 nike

我有一个使用通用属性的类。例如:

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com