Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 通过类及其子类检索枚举_C# 4.0_Reflection - Fatal编程技术网

C# 4.0 通过类及其子类检索枚举

C# 4.0 通过类及其子类检索枚举,c#-4.0,reflection,C# 4.0,Reflection,我定义了一个类,并从中派生了许多子类。父类有一个枚举,我们称之为“Barf”。每个子体也有一个名称相同但值不同的枚举。我试图弄清楚如何在祖先类中编写一个方法,该方法获取实例化对象的实际类的Barf版本。因此,如果我创建了一个祖先实例,我想让这个方法处理祖先.Barf的条目。如果我创建了祖先的一个子类的实例,我希望该方法处理Childx.Barf值 显然,这将是一个反射解决方案,但我的反射技能非常贫乏。有什么帮助吗?为了好玩,这里有一个可能的方法: public class Ancestor {

我定义了一个类,并从中派生了许多子类。父类有一个枚举,我们称之为“Barf”。每个子体也有一个名称相同但值不同的枚举。我试图弄清楚如何在祖先类中编写一个方法,该方法获取实例化对象的实际类的Barf版本。因此,如果我创建了一个祖先实例,我想让这个方法处理祖先.Barf的条目。如果我创建了祖先的一个子类的实例,我希望该方法处理Childx.Barf值


显然,这将是一个反射解决方案,但我的反射技能非常贫乏。有什么帮助吗?

为了好玩,这里有一个可能的方法:

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后代。