【问题标题】:Creating generic method and using type parameter创建泛型方法并使用类型参数
【发布时间】:2010-02-17 22:59:23
【问题描述】:

我创建了这个方法,它是一个对象工厂:

public static T GetService<T>(T serviceInterface)
{
    if (serviceInterface.Equals(typeof(IMemberService)))
    {
        return (T)(object)new MemberService();
    }
    else if (serviceInterface.Equals(typeof(ILookupService)))
    {
        return (T)(object)new LookupService();
    }
    throw new ArgumentOutOfRangeException("No action is defined for service interface " + serviceInterface.Name);
}

现在,我想更进一步,消除对“serviceInterface”参数的需要,但我的问题是 - 我不知道如何将类型参数 T 与接口进行比较:做

T.Equals(typeof(ILookupService)) 

给出编译器错误:“T”是一个“类型参数”,在给定的上下文中无效。

任何想法如何将类型参数与接口进行比较?

谢谢你, 安德烈

【问题讨论】:

标签: c# generics interface


【解决方案1】:

您可以使用typeof(T) 来获取Type 对象,它可以代替serviceInterface 的使用

例如

public static T GetService<T>()
{
    Type serviceInterface = typeof(T);
    if (serviceInterface.Equals(typeof(IMemberService)))
    {
        return (T)(object)new MemberService();
    }
    else if (serviceInterface.Equals(typeof(ILookupService)))
    {
        return (T)(object)new LookupService();
    }
    throw new ArgumentOutOfRangeException("No action is defined for service interface " + serviceInterface.Name);
}

【讨论】:

  • 该死的,我现在很尴尬!太简单了!非常感谢 Jared!
  • 当然可以,但它会等同于接口吗?如果 T 表示具体对象的类型,那么它肯定不等于接口。
  • OK 同意了,但是一秒就变臭了
  • 对我来说,通过检查特定类型/接口来启动您的泛型方法似乎是对泛型的盗用
  • 安德烈,可能没什么问题。当方法根据提供的泛型类型进行分支时,我只是发现它是一种不寻常的泛型使用。在这种情况下,我只需创建两个固定类型的非泛型方法。我很感激(来自 Jared 的 cmets)这可能不适合您的目的。
【解决方案2】:

使用typeof(T)

所以,

typeof(T).Equals(typeof(ILookupService))

【讨论】:

    【解决方案3】:

    is 运算符是否适用于此?

    【讨论】:

    • is 适用于 objects 而不是 classes,所以不,它不会为 OP 提供解决方案。可能会在他的原始设计中使用,但在删除参数时不能使用。
    【解决方案4】:
    if (typeof(IMemberService).IsAssignableFrom(typeof(T)))
    {}
    else if (typeof(ILookupService).IsAssignableFrom(typeof(T)))
    {}
    

    【讨论】:

    • 将此答案 (IsAssignableFrom) 与 JaredPar 的答案结合起来,您将获得完整的解决方案。
    • 我原来的解决方案有什么问题?我需要知道传递的类型是否与我比较的接口完全匹配
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    相关资源
    最近更新 更多