c# - 我怎样才能通过他们的属性来上课
问题描述
我有一堆类和一个自定义属性类。我所有的课程都有我的属性中定义的唯一 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));
}
解决方案
要回答您的问题,以下将起作用。但是,正如您对问题的评论所暗示的那样,这确实违背了多态性的整个想法。
像这样的情况也有很多问题,例如当多个类共享相同的属性时会发生什么?
此外,如果您确实需要在运行时动态激活类,您可以简单地使用 aQueue<Type>
而不是使用自定义 emum。
public static object magicFunction(myEnum value)
{
return Activator.CreateInstance(
Assembly.GetExecutingAssembly()
.DefinedTypes
.FirstOrDefault(x => x.GetCustomAttribute<myAtt>()?.id == (int)value));
}
推荐阅读
- r - 循环 rbind 以获取数据帧列表
- erlang - 在erlang中对每个索引的整数列表求和
- reactjs - 如何覆盖 React Material ui 1.2 TableSortLabel 中的 ArrowDownwardIcon 图标
- c# - 为什么xml反序列化中的某些属性总是返回null?
- markdown - Mkdocs 警告:404 GET require.js
- ruby-on-rails - 错误:无法构建 gem 原生扩展 (stock_quote gem)
- c# - 如何在listview c# windows应用程序中显示模型列表
- php - 未定义变量:bg footer.php 文件 - Realtor wordpress 主题
- php - 如何使用php类获取类函数中的参数
- java - 多条件 Java 循环