ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – 从枚举类型创建类的最简洁方法?

2019-06-07 17:02:04  阅读:288  来源: 互联网

标签:c enums factory system-reflection


我有以下枚举和类:

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“注册”到某种处理程序(或者是这样的方式?).我知道这可能很容易通过反射(循环通过汇编从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); 

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

标签:c,enums,factory,system-reflection
来源: https://codeday.me/bug/20190607/1195275.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有