Lin*_*ink 21 .net c# abstract-class
我有一个带有一些派生类的抽象类
public abstract class MyObject
{
public string name { get; set; }
public bool IsObject(string pattern);
...
}
public class MyObjectA : MyObject
{
public string name { get { return "MyObjectA"; } set; }
public bool IsObject(string pattern) { ... }
...
}
public class MyObjectB: MyObject
{
public string name { get { return "MyObjectB"; } set; }
public bool IsObject(string pattern) { ... }
...
}
Run Code Online (Sandbox Code Playgroud)
现在我想要一个函数,它根据字符串返回我的特定类(MyObjectA/MyObectB).问题是,我有很多if/else-clause来得到它:
public MyObject Create(string pattern)
{
MyObjectA obj = new MyObjectA();
if(obj.IsObject(pattern)
{
return obj;
}
else
{
MyObjectB objb = new MyObjectB();
if(objb.IsObject(pattern);
return objb;
else
...
}
}
Run Code Online (Sandbox Code Playgroud)
这看起来很糟糕.什么是更好的方法来做到这一点?
Rud*_*ser 28
是的,使用Reflection.
您可以使用Type.GetType获得的一个实例Type由串类,然后使用它实例化Activator.CreateInstance,像这样:
public MyObject Create(string pattern)
{
Type t = Type.GetType(pattern);
if (t == null) {
throw new Exception("Type " + pattern + " not found.");
}
return Activator.CreateInstance(t);
}
Run Code Online (Sandbox Code Playgroud)
您也可以使用Activator.CreateInstance(string, string)重载,但这不会直接返回Type所需的新实例.
正如Rudi Visser所说,你应该使用反射.
另外,为了获得您的班级名称,您不应该对其进行硬编码.如果你想使用你的名字属性只是写
public abstract class MyObject
{
public string name
{
get
{
return this.GetType().Name;
}
}
public bool IsObject(string pattern);
...
}
Run Code Online (Sandbox Code Playgroud)
如果你没有类的名称,只有一些代表它的字符串,那么你可以检查派生自的所有类 MyObject
public MyObject Create(string pattern)
{
Type[] types = Assembly.GetExecutingAssembly().GetTypes();
foreach (Type type in types.Where(t => t.IsSubclassOf(typeof(MyObject))))
{
MyObject obj = (MyObject)Activator.CreateInstance(type);
if (obj.name == pattern)
{
return obj;
}
}
throw new Exception("Type " + pattern + " not found.");
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16022 次 |
| 最近记录: |