2015-07-02 151 views
2

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

例如,这是通用类我想用,用静态工厂成员:

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"); 
    } 

谢谢 -

+0

嘛修复与'GenericClass .StaticFactory(“字符串”)宣布它;' – ryanyuyu

+1

@ryanyuyu真正的解决方案确实是将工厂移动到具有相同名称的非泛型类......但是也起作用。 –

+0

@AlexeiLevenkov,因为它是一个工厂,所以很有意义。 – ryanyuyu

回答

2

好的,感谢@recursive!这个问题的答案几乎是完美的,它需要在方法的名字多了一个,像这样的:

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

您是对的,我错过了通用参数声明。我很高兴它为你工作。 – recursive

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); 
    } 
} 
+0

Thx这是正确的方向,但是如果我将它作为一个单独的类添加,它将不会编译:错误\t 1无法找到类型或名称空间名称'T'(缺少使用指令还是缺少使用指令组装参考?)。 – MaurGi

+0

明白了,它缺少函数名称中的参数StaticFactory - 在下面发布了答案,赞美为@recursive – MaurGi