C#Generics - 推断静态工厂成员的类型

时间:2015-07-02 22:14:18

标签: c# generics

我想调用使用泛型的类的静态成员,而不指定类型并让编译器推断它们。

例如,这是我想要使用的泛型类,使用静态工厂成员:

public class GenericClass<T>
{
    public T Member;

    // Constructor
    public GenericClass(T value)
    { 
        Member = value; 
    }

    // static factory method
    public static GenericClass<T> StaticFactory(T resultData) 
    { 
        return new GenericClass<T>(resultData); 
    }
}

如果我尝试以下不编译:

    public class Class1
    {
        public GenericClass<string> returnResult1()
        {
            return GenericClass.StaticFactory("Won't Compile, but it's clear that T is a string");
        }

        public GenericClass returnResult2()
        {
            return GenericClass.StaticFactory("Won't Compile, but it's clear that T is a string");
        }
    }

错误1使用泛型类型'SampleStatic.GenericClass'需要1个类型参数

为什么我不能像静态成员一样喜欢以下内容?

    public void ICanInferTheType<T1>(T1 item);

    public void returnResult4()
    {
        ICanInferTheType("Compiles, recognizes type string");
    }

谢谢 -

2 个答案:

答案 0 :(得分:5)

通用推理仅适用于方法调用。在你的情况下,你需要它来引用一个类。给定class GenericClass<T> { ... },对GenericClass没有类型参数的任何引用都是编译错误。可以推断出通用参数的唯一时间是在方法签名上声明的泛型参数。

但是,无论如何,你都可以实现目标。如果您声明这个额外的类,您将能够以您想要的方式调用该方法。那是因为通用参数被移动到方法中。

public static class GenericClass {
    // static factory method
    public static GenericClass<T> StaticFactory<T>(T resultData) { 
        return new GenericClass<T>(resultData); 
    }
}

答案 1 :(得分:2)

好的,感谢@recursive!这个答案几乎是完美的,它需要一个更多的方法名称,如下:

public static class GenericClass
{
    // static factory method
    public static GenericClass<T> StaticFactory<T>(T resultData)
    {
        return new GenericClass<T>(resultData);
    }
}