C#泛型枚举转换为特定枚举

时间:2015-07-16 06:50:52

标签: c# enums

我有接受"T" type的通用方法,这是枚举器。在方法内部,我必须在枚举器类型上调用辅助类方法和方法名称depand。

public Meth<T> (T type) {

    if (typeof(T) == typeof(FirstEnumType)) {
       FirstEnumType t = ??? // I somehow need to convert T type to FirstEnumType
       this.helperFirstCalcBll(t);
    }
    else 
    {
        SecondEnumType t = ??? // I somehow need to convert T type to SecondEnumType
       this.helperSecondCalcBll(t);
    }    
}

4 个答案:

答案 0 :(得分:15)

从任意类型到枚举类型没有有效的强制转换,因此不允许这样做。您需要先转换为对象:

FirstEnumType t = (FirstEnumType)(object)type;

这&#34;技巧&#34;编译器通过向上转换到object(始终有效)然后向下转换为枚举类型。假设您已完成运行时类型检查,则向下转换将永远不会失败。但是,如果给出的话,在else分支中实现这一点并不能保证有效。

有人会质疑为什么这个方法首先是通用的,但这就是你如何使这个特定方法有效。

答案 1 :(得分:5)

public void Meth(FirstEnumType type) {
    this.helperFirstCalcBll(type);
}
public void Meth(SecondEnumType type) {
    this.helperSecondCalcBll(type);
}

答案 2 :(得分:2)

dynamic对于以下内容非常有用:

public void Meth<T>(T enumValue) where T : struct
{
  InternalMeth((dynamic)enumValue);
}

private void InternalMeth(FirstEnumType enumValue)
{
  this.helperFirstCalcBll(enumValue);
}

private void InternalMeth(SecondEnumType enumValue)
{
  this.helperSecondCalcBll(enumValue);
}

private void InternalMeth(object enumValue)
{
  // Do whatever fallback you need
}

这避免了必须编写所有if (typeof(T) == typeof(...))和所有内容 - 您让动态调度处理器在运行时选择最佳重载。如果所有其他人都失败,object重载就会出现,以便您可以例如抛出异常。

答案 3 :(得分:0)

尝试定义辅助方法:

private TOutput Convert<TInput, TOutput>(TInput value) 
    where TInput : struct 
    where TOutput : struct
{
    var matchingValues = Enum.GetValues(typeof(TOutput))
        .Cast<int>()
        .Where(v => System.Convert.ToInt32(value) == v);
    if(!matchingValues.Any())
    {
       var message = String.Format("No matching value found in enum '{0}' for value '{1}'.", typeof(TOutput).Name, value);
       throw new ArgumentException(message);
    }
var obj = (object)matchingValues.Single();
    return (TOutput)obj;
}

这会转换两个枚举的值,因为输出枚举中的值等于输入值。

在您的代码中,您可以按如下方式调用它:

public Meth<T> (T type) 
{
    if (typeof(T) == typeof(FirstEnumType)) 
    {
        FirstEnumType t = Convert(type);
        this.helperFirstCalcBll(t);
    }
    else 
    {
        SecondEnumType t = Convert(type);
        this.helperSecondCalcBll(t);
    }    
}