我有一个像这样的通用接口:
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];
}
}
}
答案 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中的重命名应更新搜索表达式。