首页 > 解决方案 > 我怎样才能通过他们的属性来上课

问题描述

我有一堆类和一个自定义属性类。我所有的课程都有我的属性中定义的唯一 ID。我在列表中随机添加我的类的实例。如何仅通过检查属性来识别哪个类。

基本上,

我有一个属性类

public class myAtt : Attribute
{
   public int id;

   public myAtt(int id){ this.id = id; }
}

我有一个枚举

public enum myEnum
{
   IT_IS_A_CLASS,
   IT_IS_B_CLASS,
   IT_IS_C_CLASS
}

具有此属性的类

[myAtt((int)myEnum.IT_IS_A_CLASS)]
public class A
{
   
}

[myAtt((int)myEnum.IT_IS_B_CLASS)]
public class B
{
   
}

[myAtt((int)myEnum.IT_IS_C_CLASS)]
public class C
{
   
}

我有一个线程函数,可以从另一个线程填充的队列中取出项目。不要介意线程安全。

while(true)
{
   var temp = myQ.Dequeue();
   switch((myEnum)temp.id)   <-- I basicly want to this entire switch become one-liner.
   {
      case myEnum.IT_IS_A_CLASS:  aFunction(new A()); break;
      case myEnum.IT_IS_B_CLASS:  aFunction(new B()); break;
      case myEnum.IT_IS_C_CLASS:  aFunction(new C()); break;
      .
      .
      .
      case myEnum.IT_IS_Z_CLASS:  aFunction(new Z()); break;
   }
}

我基本上想删除整个开关并成为单线。喜欢

while(true)
{
   var temp = myQ.Dequeue();
   aFunction(magicFunction((myEnum)temp.id));
}

标签: c#

解决方案


要回答您的问题,以下将起作用。但是,正如您对问题的评论所暗示的那样,这确实违背了多态性的整个想法。

像这样的情况也有很多问题,例如当多个类共享相同的属性时会发生什么?

此外,如果您确实需要在运行时动态激活类,您可以简单地使用 aQueue<Type>而不是使用自定义 emum。

public static object magicFunction(myEnum value)
{
    return Activator.CreateInstance(
        Assembly.GetExecutingAssembly()
            .DefinedTypes
            .FirstOrDefault(x => x.GetCustomAttribute<myAtt>()?.id == (int)value));
}

推荐阅读