如何将未知对象传递给方法并确定其类型?

时间:2014-03-07 16:18:00

标签: c#

我正在尝试将对象传递给构造函数中的另一个类。但传入的对象可能是两种类型中的一种。如何确定构造函数中的对象是什么?

这是我的(非工作)代码:

public DueDate(object action)
{
    if (action.GetType() == typeof(RigActionClass.RigAction)) // This is a RigAction
    {
        // Constructor logic
    }
    else // This is a UniqueRigAction
    {
        // Constructor logic
    }
 }

5 个答案:

答案 0 :(得分:6)

我有几个选项,我从头顶看到。更好的解决方案取决于您在逻辑中所做的事情。

A)超载您的.ctor。如果你在逻辑中操作DueDate,那就更好了。

public DueDate(RigActionClass.RigAction action)
{
    // RigAction logic
}

public DueDate(RigActionClass.UniqueRigAction action)
{
    // UniqueRigAction logic
}

B)创建一个公共基类并将不同的逻辑放入该操作中。如果您在逻辑中操作Action,这会更好。根据您想要完成的任务,您还可以使用界面而不是抽象类。

abstract class MyAction { public abstract void Init(); }

class RigAction : MyAction
{
    public Init() { /* RigAction Logic */ }
}

class UniqueRigAction : MyAction
{
    public Init() { /* UniqueRigAction logic */ }
}

public DueDate(MyAction action)
{
    action.Init();
}

答案 1 :(得分:1)

我不认为你需要通过做这样的事情来实现它太复杂

public  class  ActionBaseType
{

}
public class RightAction:ActionBaseType
{

}
public class  UniqueRightAction: ActionBaseType
{

}

检查

public DueDate(ActionBaseType action)
{
  if( action  is  RightAction)
{
   //do here 
}
else 
 //do here 

}

答案 2 :(得分:0)

在c#中简单if (action is RigActionClass.RigAction)

答案 3 :(得分:0)

public DueDate(object action)
{
    if (a is RigActionClass.RigAction) // This is a RigAction
    {
        // Constructor logic
    }
    else // This is a UniqueRigAction
    {
        // Constructor logic
    }
 }

答案 4 :(得分:0)

您所谓的“非工作”代码是执行此操作的可能正确方法之一。如果你没有得到预期的结果,那么你的代码就会被破坏,而不是在这里。

我刚刚在Linqpad中对此进行了测试,这肯定有效。

void Main()
{
  A a = new A();
  B b = new B();
  Print(a);
  Print(b);
}

void Print(object o)
{
  if (o.GetType() == typeof(A))
    "A".Dump();
  else if (o.GetType() == typeof(B))
    "B".Dump();
}

class A
{
}

class B : A
{
}

输出:

A
B