2016-02-13 53 views
2

我目前想寫一個通用的擴展方法。如果每一個泛型類型是在參數菱,我不需要定義泛型類型:隱式定義的泛型類型,這可能嗎?

//Extension Method 
public static GridBoundColumnBuilder<TModel> 
    BoundEnum<TModel, TValue>(this GridColumnFactory<TModel> factory, 
     Expression<Func<TModel, TValue>> expression); 

//I can call It this way, whitout setting <TModel, TValue> 
columns.BoundEnum(c => c.SomeProp); 

如果我想添加一個泛型類型,未涵蓋的參數,我需要設置<TModel, TValue>

//Extension Method 
public static GridBoundColumnBuilder<TModel> 
    BoundEnum<TModel, TValue, TEnum>(this GridColumnFactory<TModel> factory, 
     Expression<Func<TModel, TValue>> expression) 

//How it works: 
columns.BoundEnum<TModel, TValue, TEnum>(c => c.SomeProp); 

有沒有辦法我只能寫這個?

columns.BoundEnum<TEnum>(c => c.SomeProp); 

編輯:這是完整的方法:

public static GridBoundColumnBuilder<TModel> 
    BoundEnum<TModel, TValue, TEnum>(this GridColumnFactory<TModel> factory, 
       Expression<Func<TModel, TValue>> expression) 
    where TModel : class 
    where TEnum : struct, IComparable 
{ 
    return factory.ForeignKey(expression, EnumHelper.ToSelectList<TEnum>()); 
} 
+2

簡版:沒有。 C#參考(你讀過的)對我來說似乎足夠清晰;如果推論不可行,您必須提供所有類型。這就是說,你不清楚你在問什麼。在你的代碼示例中,'TEnum'類型看起來並不實際使用。那麼它有什麼意義呢?你最近想做什麼? –

+4

你可以有[double hop](http://stackoverflow.com/a/34930742):'columns.BoundExpression(c => c.SomeProp).BoundEnum ()'。 – PetSerAl

+0

我基本上想要在我的擴展方法中獲取枚舉的類型。我沒有顯示完整的方法。 @PetSerAl'EnumHelper.ToSelectList'給了我一個選擇列表與枚舉的描述屬性 –

回答

1

如果編譯器不能推斷所有的泛型類型,那麼你必須通過他們的。不支持部分推理。