1

我有一个标记接口定义为

public interface IExtender<T>
{
}

我有一个实现 IExtender 的类

public class UserExtender : IExtender<User>

在运行时,我收到 UserExtender 类型作为我的评估方法的参数

public Type Evaluate(Type type) // type == typeof(UserExtender)

如何让我的 Evaluate 方法返回

typeof(User)

基于运行时评估。我确信涉及到反射,但我似乎无法破解它。

(我不确定如何措辞这个问题。我希望它足够清楚。)

4

3 回答 3

1

有一个示例可以执行您在 MSDN 文档中描述的GetGenericTypeDefinition 方法。它使用GetGenericArguments 方法

Type[] typeArguments = t.GetGenericArguments();
Console.WriteLine("\tList type arguments ({0}):", typeArguments.Length);
foreach (Type tParam in typeArguments)
{
    Console.WriteLine("\t\t{0}", tParam);
}

在您的示例中,我认为您想替换tthis. 如果这不能直接起作用,您可能需要使用GetInterfaces 方法来枚举您的类型上的当前接口,然后GetGenericArguments()从接口类型中枚举。

于 2008-09-22T06:09:14.253 回答
1

根据提供的一些花絮,我采取了这种方式。在接口上处理多个通用参数可以变得更加健壮......但我不需要它;)

private static Type SafeGetSingleGenericParameter(Type type, Type interfaceType)
{
    if (!interfaceType.IsGenericType || interfaceType.GetGenericArguments().Count() != 1)
        return type;

    foreach (Type baseInterface in type.GetInterfaces())
    {
        if (baseInterface.IsGenericType &&
                baseInterface.GetGenericTypeDefinition() == interfaceType.GetGenericTypeDefinition())
        {
            return baseInterface.GetGenericArguments().Single();
        }
    }

    return type;
}
于 2008-09-22T06:27:08.220 回答
1

我读你的问题与其他答案完全不同。

如果评估签名可以更改为:

public Type Evaluate<T>(IExtender<T> it)
{
    return typeof(T);
}

这不需要更改调用代码,但确实需要参数为 type IExtender<T>,但是您可以轻松获取 type T

// ** compiled and tested    
UserExtender ue = new UserExtender();
Type t = Evaluate(ue);

当然,它不像只采用参数那样通用Type,但这是对问题的不同看法。另请注意,反射存在安全注意事项 [msdn]

于 2008-09-22T11:31:36.040 回答