获取通用接口的类型
本文关键字:类型 接口 获取 | 更新日期: 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中的重命名应该会更新您的搜索表达式。