C# 4.0 通过类及其子类检索枚举
我定义了一个类,并从中派生了许多子类。父类有一个枚举,我们称之为“Barf”。每个子体也有一个名称相同但值不同的枚举。我试图弄清楚如何在祖先类中编写一个方法,该方法获取实例化对象的实际类的Barf版本。因此,如果我创建了一个祖先实例,我想让这个方法处理祖先.Barf的条目。如果我创建了祖先的一个子类的实例,我希望该方法处理Childx.Barf值C# 4.0 通过类及其子类检索枚举,c#-4.0,reflection,C# 4.0,Reflection,我定义了一个类,并从中派生了许多子类。父类有一个枚举,我们称之为“Barf”。每个子体也有一个名称相同但值不同的枚举。我试图弄清楚如何在祖先类中编写一个方法,该方法获取实例化对象的实际类的Barf版本。因此,如果我创建了一个祖先实例,我想让这个方法处理祖先.Barf的条目。如果我创建了祖先的一个子类的实例,我希望该方法处理Childx.Barf值 显然,这将是一个反射解决方案,但我的反射技能非常贫乏。有什么帮助吗?为了好玩,这里有一个可能的方法: public class Ancestor {
显然,这将是一个反射解决方案,但我的反射技能非常贫乏。有什么帮助吗?为了好玩,这里有一个可能的方法:
public class Ancestor {
public enum Caffeine {
Tea,
Coffee
}
public void ProcessValues() {
var type = GetType();
var nestedEnums = from t in type.GetNestedTypes()
where t.IsEnum
select t;
var nestedEnum = nestedEnums.Single();
foreach(var val in Enum.GetValues(nestedEnum)) {
Console.WriteLine("Drinking {0}", val);
}
}
}
public class Descendant : Ancestor {
public new enum Caffeine {
Jolt,
RedBull
}
}
// The following prints:
// Drinking Jolt
// Drinking RedBull
Ancestor x = new Descendant();
x.ProcessValues();
当然,使用多态性也可以实现同样的效果:
public class Ancestor {
public enum Caffeine {
Tea,
Coffee
}
protected virtual Type GetNestedEnum() {
return typeof(Ancestor.Caffeine);
}
public void ProcessValues() {
var nestedEnum = GetNestedEnum();
foreach(var val in Enum.GetValues(nestedEnum)) {
Console.WriteLine("Drinking {0}", val);
}
}
}
public class Descendant : Ancestor {
public new enum Caffeine {
Jolt,
RedBull
}
protected override Type GetNestedEnum() {
return typeof(Descendant.Caffeine);
}
}
然而,正如Justin Morgan所指出的,需要这样的构造可能表明代码中存在潜在的设计问题。这可能是反射的结果,但它似乎是基于枚举的源代码名的代码气味编程,这基本上是任意的,而且应该是任意的。为什么不把所有可能的值都放在枚举中,然后创建一个抽象方法,比如public abstract IEnumerable GetBarf,这样做感觉不对。想了想,但这意味着每次添加子体时,我都必须修改基类。如果您将枚举保留在自己的类中,则不会。不管怎样,我仍然认为这比使用反射更可取。这是一个有趣的问题,但更多的是关于我能做什么,而不是我应该做什么。谢谢你。即使我最终找到了更好的代码设计,你给出的例子也是有教育意义的——从来都不是坏事。至于我的设计,是的,我对它不满意,我仍在努力想出更好的东西。如果我想不出其他任何东西,我会选择enum后代。