获取通用接口的类型?

时间:2012-01-16 14:26:43

标签: c# generics

我有一个像这样的通用接口:

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

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

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

最后我得到了一个:

var MyType = typeof(MyFont);

我现在想要从MyType获取System.Drawing.Font类型! 目前,我得到了这段代码:

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

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

编辑: 这个解决方案适合那些会遇到同样问题的人:

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

2 个答案:

答案 0 :(得分:11)

由于您的MyFont类只实现了一个接口,您可以编写:

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

如果您的类实现了多个接口,则可以使用您正在查找的接口的错位名称调用GetInterface()方法:

Type myType = typeof(MyFont).GetInterface("IResourceDataType`1")
                            .GetGenericArguments()[0];

答案 1 :(得分:1)

var fontTypeParam = typeof(MyFont).GetInterfaces()
    .Where(i => i.IsGenericType)
    .Where(i => i.GetGenericTypeDefinition() == typeof(IResourceDataType<>))
    .Select(i => i.GetGenericArguments().First())
    .First()
    ;

这会让您担心重命名界面。没有字符串文字,因此Visual Studio中的重命名应更新搜索表达式。