获取通用接口的类型

本文关键字:类型 接口 获取 | 更新日期: 2023-09-27 18:20:38

我得到了一个像这样的通用接口:

public interface IResourceDataType<T>
{
    void SetResourceValue(T resValue);
}

然后我得到了实现我的接口的类:

public class MyFont : IResourceDataType<System.Drawing.Font>
{
    //Ctor + SetResourceValue + ...
}

最后我得到了一个:

var MyType = typeof(MyFont);

I、 现在,想要从MyType中获取System.Drawing.Font类型!此刻,我得到了这个代码:

if (typeof(IResourceDataType).IsAssignableFrom(MyType))
{
    //If test is OK
}

但我无法在这里"提取"我的类型。。。我尝试了一些GetGenericArguments()和其他东西,但它们要么不编译,要么返回null值/List。。。我该怎么办?

编辑:以下是适合我的代码的解决方案,适用于那些将遇到相同问题的人:

if (typeof(IResourceDataType).IsAssignableFrom(MyType))
{
    foreach (Type type in MyType.GetInterfaces())
    {
        if (type.IsGenericType)
            Type genericType = type.GetGenericArguments()[0];
        }
    }
}

获取通用接口的类型

由于MyFont类只实现一个接口,因此可以编写:

Type myType = typeof(MyFont).GetInterfaces()[0].GetGenericArguments()[0];

如果您的类实现了几个接口,那么您可以调用GetInterface()方法,该方法具有您要查找的接口的损坏名称:

Type myType = typeof(MyFont).GetInterface("IResourceDataType`1")
                            .GetGenericArguments()[0];
var fontTypeParam = typeof(MyFont).GetInterfaces()
    .Where(i => i.IsGenericType)
    .Where(i => i.GetGenericTypeDefinition() == typeof(IResourceDataType<>))
    .Select(i => i.GetGenericArguments().First())
    .First()
    ;

这可以解决您对重命名接口的担忧。没有字符串文字,因此Visual Studio中的重命名应该会更新您的搜索表达式。