返回未知对象
Returning an unknown object
例如,我有一个名为 baseAbstractClass 的基础 class 和几个派生的 classes:
public class Derived : baseAbstractClass
{
public Derived()
{
}
// abstract methods go here
}
public class DerivedEx : baseAbstractClass
{
// code goes here
}
我有这个 class:
public class SomeClass
{
public SomeClass()
{
}
object ReturnMeAnObject(int whichObject)
{
object toReturn = null;
if (whichObject == 0)
{
toReturn = new Derived();
}
else
if (whichObject == 1)
{
toReturn = new DerivedEx();
}
return toReturn;
}
}
在我的主函数中:
public class Start
{
static void Main()
{
SomeClass someClass = new SomeClass()
Derived derived = (Derived)someClass.ReturnMeAnObject(0);
}
}
我 returning 的对象在运行时之前是未知的,但实际上我不知道对象的类型将被 returned - 它可能是派生的,或 DerivedEx。
有没有比在 Main 函数中强制转换我的 return 值更简单的方法,因为这会导致非常大的 switch 语句,或者非常大的一组 If...Else 条件。
我试图通过构建 class 图来确定我的设计是否正确,但似乎无法将其放入代码中。
如有任何帮助,我们将不胜感激。
你可以在这里使用多态性 return base class object
:
baseAbstractClass ReturnMeAnObject(int whichObject)
{
baseAbstractClass toReturn = null;
if (whichObject == 0)
{
toReturn = new Derived();
}
else
if (whichObject == 1)
{
toReturn = new DerivedEx();
}
return toReturn;
}
你可以测试它:
SomeClass someClass = new SomeClass();
var derived = someClass.ReturnMeAnObject(0);
var DerviedTyped = Convert.ChangeType(derived,derived.GetType());
更新:
您可以使用 Convert.ChangeType()
动态转换它:
SomeClass someClass = new SomeClass();
var derived = someClass.ReturnMeAnObject(0);
var derviedTypedObject = Convert.ChangeType(derived,derived.GetType());
您的问题可以使用泛型来解决。您必须限制通用参数 T
并确保使用的 class 具有默认构造函数。
public T ReturnMeAnObject<T>() where T : baseAbstractClass, new()
{
return new T();
}
然后您可以在您的代码中使用它,如下所示:
SomeClass someClass = new SomeClass()
Derived derived = someClass.ReturnMeAnObject<Derived>();
DerivedEx derivedEx = someClass.ReturnMeAnObject<DerivedEx>();
您也可以使用反射 class。喜欢:
object derived = someClass.ReturnMeAnObject(0);
Type t = derived.GetType();
switch (t.Name)
{
case "Derived":
//do something
break;
case "DerivedEx":
//do something
break;
default:
break;
}
例如,我有一个名为 baseAbstractClass 的基础 class 和几个派生的 classes:
public class Derived : baseAbstractClass
{
public Derived()
{
}
// abstract methods go here
}
public class DerivedEx : baseAbstractClass
{
// code goes here
}
我有这个 class:
public class SomeClass
{
public SomeClass()
{
}
object ReturnMeAnObject(int whichObject)
{
object toReturn = null;
if (whichObject == 0)
{
toReturn = new Derived();
}
else
if (whichObject == 1)
{
toReturn = new DerivedEx();
}
return toReturn;
}
}
在我的主函数中:
public class Start
{
static void Main()
{
SomeClass someClass = new SomeClass()
Derived derived = (Derived)someClass.ReturnMeAnObject(0);
}
}
我 returning 的对象在运行时之前是未知的,但实际上我不知道对象的类型将被 returned - 它可能是派生的,或 DerivedEx。 有没有比在 Main 函数中强制转换我的 return 值更简单的方法,因为这会导致非常大的 switch 语句,或者非常大的一组 If...Else 条件。
我试图通过构建 class 图来确定我的设计是否正确,但似乎无法将其放入代码中。
如有任何帮助,我们将不胜感激。
你可以在这里使用多态性 return base class object
:
baseAbstractClass ReturnMeAnObject(int whichObject)
{
baseAbstractClass toReturn = null;
if (whichObject == 0)
{
toReturn = new Derived();
}
else
if (whichObject == 1)
{
toReturn = new DerivedEx();
}
return toReturn;
}
你可以测试它:
SomeClass someClass = new SomeClass();
var derived = someClass.ReturnMeAnObject(0);
var DerviedTyped = Convert.ChangeType(derived,derived.GetType());
更新:
您可以使用 Convert.ChangeType()
动态转换它:
SomeClass someClass = new SomeClass();
var derived = someClass.ReturnMeAnObject(0);
var derviedTypedObject = Convert.ChangeType(derived,derived.GetType());
您的问题可以使用泛型来解决。您必须限制通用参数 T
并确保使用的 class 具有默认构造函数。
public T ReturnMeAnObject<T>() where T : baseAbstractClass, new()
{
return new T();
}
然后您可以在您的代码中使用它,如下所示:
SomeClass someClass = new SomeClass()
Derived derived = someClass.ReturnMeAnObject<Derived>();
DerivedEx derivedEx = someClass.ReturnMeAnObject<DerivedEx>();
您也可以使用反射 class。喜欢:
object derived = someClass.ReturnMeAnObject(0);
Type t = derived.GetType();
switch (t.Name)
{
case "Derived":
//do something
break;
case "DerivedEx":
//do something
break;
default:
break;
}