gpt4 book ai didi

c# - 从枚举类型创建类的最干净的方法?

转载 作者:太空狗 更新时间:2023-10-30 01:00:11 24 4
gpt4 key购买 nike

我有以下枚举和类:

public enum MyEnum
{
MyType1,
MyType2
}

public abstract class MyBaseClass
{
public abstract MyEnum GetMyType();
}

public class MySubClass : MyBaseClass
{
public override MyEnum GetMyType()
{
return MyEnum.MyType1;
}
}

我想创建一个基于 GetMyType() 的 MySubClass 实例,但不需要将 MySubClass“注册”到某种处理程序(或者这是要走的路吗?)。我知道这可能很容易通过反射来完成(通过 Assembly 循环从 MyBaseClass 继承的类并检查它们的 MyType),但这是要走的路吗?

现在我正在做一些很长的事情:

public MyBaseClass CreateMyClass(MyEnum myEnum)
{
if(myEnum == MyEnum.MyType1)
{
return new MySubClass();
}
else if(myEnum == MyEnum.MyType2)
{
return new MyOtherSubClass();
}
}

这最终会导致我忘记手动添加新类。它将在测试中被捕获,但我宁愿根本不必添加类,因为已经提供了所有需要的信息。

乐于接受有关最佳方法的各种建议。

最佳答案

您可以创建自定义属性来标识所需的枚举类。

public class MyCustomAttribute : Attribute
{
public MyEnum EnumType { get; set; }
}

然后是枚举和类;

public enum MyEnum
{
MyType1,
MyType2
}
public class MyBaseClass
{

}
[MyCustomAttribute(EnumType = MyEnum.MyType1)]
public class MySubClass : MyBaseClass
{

}
[MyCustomAttribute(EnumType = MyEnum.MyType2)]
public class MyOtherClass : MyBaseClass
{

}

你可以使用 Reflection用枚举来确定相关的类。

private static Dictionary<MyEnum, Type> _myEnumDictionary = new Dictionary<MyEnum, Type>();

public MyBaseClass GetEnumClass(MyEnum enumType)
{
if (!_myEnumDictionary.ContainsKey(enumType))
{
var enumClass = typeof(MySubClass).Assembly
.GetTypes()
.FirstOrDefault(x => x.GetCustomAttributes<MyCustomAttribute>()
.Any(k => k.EnumType == enumType));
if (enumClass == null)
{
throw new Exception("There is no declared class with the enumType" + enumType);
}
_myEnumDictionary.Add(enumType, enumClass);
}
return (MyBaseClass)Activator.CreateInstance(_myEnumDictionary[enumType]);
}

最后,你可以像这样获取相关类的实例;

var mySubClass = GetEnumClass(MyEnum.MyType1);
var myOtherClass = GetEnumClass(MyEnum.MyType2);
//There is no lookup here. It will get the Type from Dictionary directly.
var mySubClass2 = GetEnumClass(MyEnum.MyType1);

此外,您可以使用静态 Dictionary<MyEnum, Type>字典收集以防止每次查找。

关于c# - 从枚举类型创建类的最干净的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48519048/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com