我正在尝试将对象传递给构造函数中的另一个类。但传入的对象可能是两种类型中的一种。如何确定构造函数中的对象是什么?
这是我的(非工作)代码:
public DueDate(object action)
{
if (action.GetType() == typeof(RigActionClass.RigAction)) // This is a RigAction
{
// Constructor logic
}
else // This is a UniqueRigAction
{
// Constructor logic
}
}
答案 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