这对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);
哪种方法有效但却有一种失败的意思?
非常感谢
答案 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