2016-05-07 69 views
0

ClassAClassBClassCClassD都實現IMyClass接口。如何獲取對象的類型,並把它作爲在C#中的參數

myObj是其中一個類的實例。

private void setObj<T>() 
{ 
    myObj = mycollection.Single(w => w is T); 
} 

public void Switch() 
{ 
    if(myObj is ClassA) 
    { 
     setObj<ClassA>(); 
    } 
    else if(myObj is ClassB) 
    { 
     setObj<ClassB>(); 
    } 
    else if(myObj is ClassC) 
    { 
     setObj<ClassC>(); 
    } 
    else if(myObj is ClassD) 
    { 
     setObj<ClassD>(); 
    } 
} 

我們如何重構Switch方法,讓我有這樣的事情:

public void Switch() 
{ 
    // How can we know from `myObj`, which class it is and rewrite 
    // the whole Switch method like this 
    // X = `ClassA`, `ClassB`, `ClassC` or `ClassD` 

    setObj<X>(); 

} 
+0

讓我確認我正確地理解了這個問題:您確定調用Switch方法作爲泛型,傳入的類型是?那麼,'Switch ()'可以接受嗎?如果是這樣,你的重構建議應該工作得很好。我錯過了什麼? – CoolBots

回答

2

你不能傳遞一個泛型類型參數作爲C#中的變量#。但是,你可以通過反射(myObj.GetType())的類型和傳遞作爲函數參數從Switch()功能,以您的setObj()功能,這反過來又可以在你的拉姆達進行比較:

private void setObj(Type type) 
    { 
     myObj = Objects.Single(o => o.GetType() == type); 
    } 

    public void Switch() 
    { 
     Type setToThisType = myObj.GetType(); 
     setObj(setToThisType); 
    } 
-1

嘗試使用typeof(ClassA的)

public void TypeTest(Type t) 
{ 
    if(t.Equals(typeof(ClassA))){ 
    } 
} 
+0

這對重構該方法沒有幫助。 – Vahid

0

使Switch泛型方法太接受類型的objectT

public void Switch<T>(T obj) where T : IMyClass 
{ 
    setObj<T>(); 
} 

where T : IMyClass語句確保你只能調用Switch其中obj是一個instance一個class實施IMyClass

void Example() 
    { 
     ClassA objA = new ClassA(); 
     Switch(objA); //OK; 

     ClassX objX = new ClassX(); 
     Switch(objX); //compile-time error since ClassX doesn't implement IMyClass 
    } 

編輯:閱讀標題後,我想你需要有參數T objSwitch方法。

+0

是的,這就是我最初的想法,因此我對原始帖子發表評論......我不認爲這就是OP所要求的,但我認爲他們有興趣從一個變量中傳遞一個類型作爲泛型類型參數。 – CoolBots

+0

啊我看到了,但我認爲OP想要滿足'Switch'應該只接受''從'IMyClass'繼承''的類型'的條件,因此我添加了'where T:IMyClass' –

相關問題