我想有一系列静态类,每个类都包含一个字典,并在字典上执行两个方法。除了一个方法中的参数类型和另一个方法中的返回类型外,这些方法在所有类的版本中都是相同的。
理想情况下,我希望将行为(方法)放在" base"通用静态类,然后创建几个类型的静态后代,每个后代包含自己的静态字典。显然,我无法做到这一点,因为一个静态类不能从另一个静态类继承。
我想知道是否有其他方法可以实现我的目标。我知道我可以使用非静态类来完成这项工作,但在我看来,这更适合作为静态任务。
这是我想要的草图:
public static class BaseClass<T>
{
private static Dictionary<string, T> PrivateDict {get; set;}
private static String ToString(T argument)
{
return Somestring;
}
private static T FromString(string argument)
{
return Some-T-thing;
}
}
// This static class supplies the static dictionary but gets the static methods of BaseClass.
// Other static classes might exit that use, for instance, Dictionary<string, XElement>
public static class GenderClass : BaseClass<int>
{
private static Dictionary<string, int> PrivateDict = new Dictionary<string, int>
{
{"Male", 1},
{"Boy", 1},
{"M", 1},
{"Female", 2},
{"Girl", 2},
{"F", 2}
}
}
答案 0 :(得分:3)
我建议使用type作为“继承”的路径。我在引号中说,因为它实际上只是一个旁路,但它仍然应该以你想要的方式工作。
我在LinqPad中测试了它,它产生了正确的结果,没有抛出异常。请注意,这些字段是公开用于测试目的。
首先,设置一个可用于传递词典的界面。
public interface IPublicDictionary<T>
{
Dictionary<string, T> PublicDictionary { get; }
}
接下来,设置您的类(非静态),它将实现该接口并公开一个唯一的字典
public class GenderClass : IPublicDictionary<int>
{
public static Dictionary<string, int> PublicDict = new Dictionary<string, int>
{
{"Male", 1},
{"Boy", 1},
{"M", 1},
{"Female", 2},
{"Girl", 2},
{"F", 2}
};
public Dictionary<string, int> PublicDictionary
{
get { return PublicDict; }
}
}
现在这个类已经准备好在静态基类中使用了,它已经变成了主要的工作场所。
public static class BaseClass
{
public static String ToString<F,T>(F argument) where T : IPublicDictionary<F>, new()
{
IPublicDictionary<F> t = new T();
return t.PublicDictionary.First(d => Comparer<F>.Equals((F)d.Value, argument)).Key;
}
public static F FromString<T,F>(string argument) where T : IPublicDictionary<F>, new()
{
IPublicDictionary<F> t = new T();
return t.PublicDictionary[argument];
}
}
设置完成后,剩下的就是简单地调用基类。以下是我试过的两个样本。
var s = BaseClass.FromString<GenderClass,int>("F");
Console.WriteLine(s);
var t = BaseClass.ToString<int,GenderClass>(2);
Console.WriteLine(t);
哪个输出
2
Female
答案 1 :(得分:0)
关于某些东西是否应该是静态的决定与你将要使用它的方式有关。如果你必须有一些静态的东西,我个人会这样做:
public interface foo
{
string ToString(someBase input);
someBase FromString(string input);
}
public static class Bar
{
public static string ToString(someBase input)
{
if (input.GetType() == typeof(Duck))
{
foo duckie = new DuckHandler();
return duckie.ToString(input);
}
else if (input.GetType() == typeof(DeadParrot)) { /* ..snip.. */ }
}
public static someBase FromString(string input, type Type) {
if (type == typeof(Duckie))
{
foo duckie = new DuckHandler(input);
return duckie;
}
else if (type == typeof(OKLumberjack)) { /* ..snip.. */ }
}
}
你可以看到这一点。