C# 获取一个没有很多if语句的类
我有一定数量的类继承自抽象类:C# 获取一个没有很多if语句的类,c#,class,xna,C#,Class,Xna,我有一定数量的类继承自抽象类: abstract public class baseClass { //logics } public class child1 : baseClass { } public class child2 : baseClass { } 现在我有了一些管理类,它必须根据一个枚举创建其中一个类,该枚举的值将具有相同的名称,如下所示: public enum ClassType { child1, child2 } public class
abstract public class baseClass
{
//logics
}
public class child1 : baseClass
{
}
public class child2 : baseClass
{
}
现在我有了一些管理类,它必须根据一个枚举创建其中一个类,该枚举的值将具有相同的名称,如下所示:
public enum ClassType
{
child1,
child2
}
public class Manager
{
private List<baseClass> _workers;
public void Initialize(ClassType type)
{
//what logics to put here? (resulting in correctChild)
_workers.Add(correctChild);
}
}
公共枚举类类型
{
孩子1,
孩子2
}
公共班级经理
{
私人名单(劳工),;
公共void初始化(类类型)
{
//在这里放什么逻辑?(导致正确的孩子)
_工人。添加(儿童);
}
}
我正在考虑typeof,但不知道如何实现它。
注意:在本例中,它是2个类,但在实际情况中,它是任意数量的类。有很多方法可以区分类型 您可以使用
is
运算符
var o = ...;
if (o is Child1) {}
var child = o as Child1;
if (child != null) {}
或者您可以将用作运算符
var o = ...;
if (o is Child1) {}
var child = o as Child1;
if (child != null) {}
或者您已经描述过的,操作员的类型
但我感觉到的是,如果你对类型转换有强烈的需求,那么手头上可能还有其他东西。也许你可以用这个方法解决你的问题。然后,您不必在冗长的if-else
或case-switch
构造中区分所有不同的类型,但您可以将“不同的行为”委托给您的子类。如果您不想使用if语句,您可以使用case语句吗?比如:
public class Manager
{
private List<baseClass> _workers;
public void Initialize(ClassType type)
{
switch (type)
{
case child1:
_workers.Add(correctChild);
break;
case child2:
_workers.Add(correctChild);
break;
}
}
}
公共类管理器
{
私人名单(劳工),;
公共void初始化(类类型)
{
开关(类型)
{
案例1:
_工人。添加(儿童);
打破
案例2:
_工人。添加(儿童);
打破
}
}
}
看一看
使用命名程序集和默认构造函数创建指定名称的类型的实例
所以代码看起来像
Activator.CreateInstance(type.ToString(),assemblyName);
Activator.CreateInstance(classType.Description(), assemblyName);
实际上,我对这种实现很熟悉,我自己也使用过。
我还建议您深入研究如何实际使用枚举值上的属性来存储实际的类名。您甚至可以将其用作扩展
public static string Description(this Enum enumValue) {
Type enumType = enumValue.GetType();
FieldInfo field = enumType.GetField(enumValue.ToString());
object[] attributes = field.GetCustomAttributes(typeof(DescriptionAttribute), false);
return attributes.Length == 0 ? enumValue.ToString() : ((DescriptionAttribute)attributes[0]).Description;
}
然后,代码将类似于
Activator.CreateInstance(type.ToString(),assemblyName);
Activator.CreateInstance(classType.Description(), assemblyName);
如果您不需要属性的开销,并且是从同一个程序集运行的,那么您可以使用正在执行的程序集通过反射加载类型Activator.CreateInstance
可以为您动态构建对象
public class Manager
{
private List<baseClass> _workers = new List<baseClass>();
public void Initialize(ClassType type)
{
string assemblyName = Assembly.GetExecutingAssembly().GetName().Name;
Type objType = Type.GetType(string.Format("{0}.{1},{0}", assemblyName, type.ToString()));
var correctChild = (baseClass)Activator.CreateInstance(objType);
_workers.Add(correctChild);
}
}
公共类管理器
{
私有列表_workers=新列表();
公共void初始化(类类型)
{
字符串assemblyName=Assembly.GetExecutionGassembly().GetName().Name;
Type objType=Type.GetType(string.Format(“{0}.{1},{0}”,assemblyName,Type.ToString());
var correctChild=(基类)Activator.CreateInstance(objType);
_工人。添加(儿童);
}
}
开关仍然不能处理任意部分。因此,我的意思是,它应该允许通过向枚举添加新值来检测新的类类型。啊,对不起,我以为您不想使用if语句。谢谢,这是我等待的答案:)未知数量的类的完美简短实现!如果我这样做,当我将它添加到列表中时,会出现一个错误。NullReferenceException,对象引用未设置为对象的实例。@Danahi您需要初始化列表
实例…这就是为什么我在类初始化期间这样做(默认)。确保您new
u workers集合-例如\u workers=new List()代码>omg新手出错了,我一遍又一遍地检查这个类,不知道为什么它会是空的,因为它包含值:P