2014-03-07 75 views
0

我想將一個對象傳遞給構造函數中的另一個類。但傳入的對象可能是兩種類型中的一種。我如何確定構造函數中的對象是什麼?如何將未知對象傳遞給方法並確定其類型?

這裏是我的(非工作)代碼:

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

爲什麼你貼什麼 「不工作」?如果您收到編譯器錯誤,請將其發佈。如果它編譯但做了一些你在運行時不期望的東西,請發佈你期望它做什麼以及它實際做了什麼。 – TypeIA

+0

您需要解釋如何使用動作參數來期望正確的答案 – Jaguar

回答

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

在c#中簡單的if (action is RigActionClass.RigAction)

0
public DueDate(object action) 
{ 
    if (a is RigActionClass.RigAction) // This is a RigAction 
    { 
     // Constructor logic 
    } 
    else // This is a UniqueRigAction 
    { 
     // Constructor logic 
    } 
} 
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 

} 
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 
相關問題