gpt4 book ai didi

c# - 获取已实现的通用接口(interface)类型

转载 作者:行者123 更新时间:2023-11-30 20:48:51 27 4
gpt4 key购买 nike

我有一个通用接口(interface),我想要一个已实现数据类型的列表。使用以下代码,我不会返回任何类型。 (类型中的 t)

var type = typeof (IDataTypeConverter<>);
var types = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(x => x.GetTypes())
.Where(x => type.IsAssignableFrom(x) && !x.IsInterface);

foreach (var t in types)
{
var instance = (IDataTypeConverter)Activator.CreateInstance(t);
PropertiesConverter.Add(t, instance);
}

这是一个接口(interface)实现的例子:

public class DecimalConverter : IDataTypeConverter, IDataTypeConverter<decimal>
{
...
}

接口(interface)本身:

public interface IDataTypeConverter
{
object Convert(object value);
}

public interface IDataTypeConverter<TDataType>
{

}

我在这里做错了什么,为什么我的列表中没有得到 decimal 作为一种类型?

最佳答案

你快到了。您正在检查您的类是否可分配给开放通用类型 IDataTypeConverter<>他们不是。它们只能分配给封闭 通用类型,例如IDataTypeConverter<decimal>。 (或 TDataType 的其他数据类型)

var type = typeof (IDataTypeConverter<>);
var types = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(x => x.GetTypes())
.Where(x => !x.IsInterface) //ignore interface definitions
.Where(x => x.GetInterfaces() //for each interface implemented
.Where(i => i.IsGenericType) //if they're a generic interface
.Any(i => i.GetGenericTypeDefinition() == type)); //check its open-generic

我认为可能有更简单的检查方法,但这可以完成工作。它获取一个类型的所有接口(interface),对于每个通用接口(interface),它检查它的底层开放通用定义是否为 IDataTypeConverter<> .

编辑:另一种证明我的意思的方法,您现有的代码如果适用于type。你分配了typeof(IDataTypeConverter<decimal>)反而。之所以可行,是因为您的类型可以分配给 IDataTypeConverter<decimal>但它们不能分配给 IDataTypeConverter<>因为这样的操作在 C# 中没有意义。

关于c# - 获取已实现的通用接口(interface)类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24138170/

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