C# 创建泛型方法并使用类型参数

C# 创建泛型方法并使用类型参数,c#,generics,interface,C#,Generics,Interface,我创建了此方法,它是一个对象工厂: public static T GetService<T>(T serviceInterface) { if (serviceInterface.Equals(typeof(IMemberService))) { return (T)(object)new MemberService(); } else if (serviceInterface.Equals(typeof(ILookupService

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

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);
}
给出编译器错误:“T”是“类型参数”,在给定上下文中无效

你知道如何将类型参数与接口进行比较吗

谢谢,, Andrey

您可以使用
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);
}
publicstatict GetService()
{
服务接口类型=类型(T);
if(serviceInterface.Equals(typeof(IMemberService)))
{
返回(T)(对象)newmemberservice();
}
else if(serviceInterface.Equals(typeof(ILookupService)))
{
返回(T)(对象)newlookupservice();
}
抛出新ArgumentOutOfRangeException(“没有为服务接口定义任何操作”+serviceInterface.Name);
}
使用
typeof(T)

所以


接线员能在这里工作吗?

该死,现在我很尴尬!太简单了!谢谢你,杰瑞德!当然可以,但它会成为一个接口吗?如果T代表一个具体对象的类型,那么它肯定不等于一个接口。好吧,我同意,但在我看来,它第二次变得更臭了。开始你的泛型方法时检查特定类型/接口,这似乎是滥用泛型。Andry,可能没什么错。我只是发现,当方法根据提供的泛型类型进行分支时,泛型是一种不寻常的用法。在这种情况下,我只需创建两个固定类型的非泛型方法。我(从Jared的评论中)了解到这可能不符合您的目的。将此答案(
IsAssignableFrom
)与JaredPar的答案结合起来,您将得到完整的解决方案。我原来的解决方案有什么问题?我需要知道传递的类型是否与我所比较的接口完全匹配
is
是否适用于对象而不是类,因此不,它不会为OP提供解决方案。它可以用于他的原始设计,但在删除参数时不能使用。您可以从serviceInterface变量中选择值,如下->
if (typeof(IMemberService).IsAssignableFrom(typeof(T)))
{}
else if (typeof(ILookupService).IsAssignableFrom(typeof(T)))
{}
typeof(T).Equals(typeof(ILookupService))
if (typeof(IMemberService).IsAssignableFrom(typeof(T)))
{}
else if (typeof(ILookupService).IsAssignableFrom(typeof(T)))
{}