2016-02-13 55 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

如果编译器不能推断所有的泛型类型,那么你必须通过他们的。不支持部分推理。