2015-07-02 188 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