返回未知对象

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());

EXAMPLE FIDDLE

更新:

您可以使用 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;
        }