c#“枚举”方法和“枚举”参数

时间:2016-04-05 08:08:44

标签: c# enums

这对google来说是个难题!

我有一个以“Enum”作为参数的扩展方法。

.....
ap.declareXPathNameSpace("S2SCTScf", "urn:S2SCTScf:xsd:$SCTScfBlkCredTrf");
str = "/S2SCTScf:SCTScfBlkCredTrf/CdtTrfTxInf";
ap.selectXPath(str);
.....

但是当我尝试将它与声明的枚举一起使用时,编译器找不到扩展方法

    public static T GetEntry<T>(this Dictionary<Enum, string> dictionary, Enum key)
    {
        string val;
        if (dictionary.TryGetValue(key, out val))
        {
            return (T)Convert.ChangeType(val, typeof(T));               
        }
        return default(T);
    }

除了将字典声明为

之外,还有任何想法
Dictionary<CmdAttr, String> Attributes;
cmd.CommandText.Attributes.GetEntry<double>(CommandText.CmdAttr.X);

哪种方法有效但却有一种失败的意思?

非常感谢

2 个答案:

答案 0 :(得分:1)

您不能完全按照自己的意愿去做,因为个别枚举不是Enum的子类。但是虽然这段代码并不像你想的那么漂亮,但它并不难看,而且它可以按你的喜好运行:

// MyTestEnum.cs

enum MyTestEnum
{
    First,
    Second,
    Third
}

// Extensions.cs

static class Extensions
{
    public static TResult GetEntry<TEnum, TResult>(this Dictionary<TEnum, string> dictionary, TEnum key)
    {
        string value;
        if (dictionary.TryGetValue(key, out value))
        {
            return (TResult)Convert.ChangeType(value, typeof(TResult));
        }
        return default(TResult);
    }
}

// most likely Program.cs

void Main()
{
    Dictionary<MyTestEnum, string> attributes = new Dictionary<MyTestEnum, string>();
    attributes.Add(MyTestEnum.First, "1.23");

    // *** here's the actual call to the extension method ***
    var result = attributes.GetEntry<MyTestEnum, double>(MyTestEnum.First);

    Console.WriteLine(result);
}

答案 1 :(得分:-1)

您想要做的是(以下是无效的C#代码):

public static T GetEntry<T,U>(this Dictionary<U, string> dictionary, U key) where U : Enum
{
    // your code
}

这不会编译(Constraint不能是特殊类'Enum')。 所以你必须寻找替代品。 this问题有一些很好的答案。最简单的方法是使用where U : struct, IConvertible