2017-07-21 71 views
1

有沒有一種方法可以告訴一種通用類型的方法?我想要做的就是告訴它只能是A型或B,但沒有別的的一個對象的方法,所以我可以像在C#中使用泛型類型作爲參數

if (myObject.GetType() == typeof(myTypeA)){doAstuff();} if (myObjectGetType() == typeof(myTypeB)) {doBstuff();}

method<T>(T myObject){ T = myTypeA, T = myTypeB, T = nothing else} 

感謝內工作的任何幫助

+5

爲什麼不只是有兩種不同參數類型的方法?泛型帶來了什麼? –

+0

我想要做的是myTypeA和myTypeB共享一些我想調用的相同方法,但myTypeB有一些我想要處理
,並且有很多相同的東西,所以如果我使2個獨立的方法我有噸的冗餘,讓我做這篇文章,因爲這是舊的解決方案 – Gotti92

+1

你是在尋找[''Type.GetGenericArguments()'](https://stackoverflow.com/q/557340/3744182)? – dbc

回答

1

你可以檢查的方法中的類型,然後將其轉換爲適當的類型,並做相應的「東西」:

public void method<T>(T myObject) 
{ 
    if (myObject is myTypeA) 
    { 
     myTypeA objA = myObject as myTypeA; 
     objA.DoA_Stuff(); 
    } 
    else if (myObject is myTypeB) 
    { 
     myTypeB objB = myObject as myTypeB; 
     objB.DoB_Stuff(); 
    } 
    else 
    { 
     return ; 
    } 
} 

但是,這將是仿製藥的浪費。如果他們共享一些方法,你也可以創建一個基類,並讓typeA和typeB繼承它。然後你的方法可能需要一個基類對象作爲參數:

public void method(BaseClass myObject) 

而且將只有一個如果 - 情況下,一個鑄造。只有具有更多方法的那個纔是基類。

編輯:

想象一下,你就會有這樣的結構:

public class BaseType 
{ 
    public int SharedProp { get; set; } // shared property 

    public virtual int DoSharedStuff() // shared method 
    { 
     return SharedProp; 
    }  
} 

public class myTypeA : BaseType 
{ 
    public int A_Prop { get; set; } 

    // overwritten shared meth adjusted to the needs of type A 
    public override int DoSharedStuff() 
    { 
     return base.SharedProp + this.A_Prop; 
    } 
} 

public class myTypeB : BaseType 
{ 
    public int B_Prop { get; set; } 

    // overwritten shared meth adjusted to the needs of type B 
    public override int DoSharedStuff() 
    { 
     return base.SharedProp + this.B_Prop; 
    } 

    // individual method of Type B 
    public int DoB_Stuff() 
    { 
     return this.B_Prop; 
    } 
} 

然後你的方法將只需要基類的孩子之一,並執行根據需要:

public void method(BaseType myObject) 
{ 
    // shared case: here type A will perform type A action 
    // and type B will perform type B action 
    myObject.DoSharedStuff(); 

    // case B where you need really the extra stuff! 
    if (myObject is myTypeB) 
    { 
     myTypeB objB = myObject as myTypeB; 
     objB.DoB_Stuff(); 
    } 
} 

這種方法或現象被稱爲Polymorphism

+0

TypeA和TypeB基本相同,除了TypeB有一些更多的屬性,但這兩個對象都來自一個XML,所以它很難有一個接口 – Gotti92

+0

我不是在談論接口,你可以使用簡單的繼承,方法不是XML的一部分,所以你可以把方法放到基類中,並在typeClasses中覆蓋它們。這樣他們仍然會被序列化 –

+0

是的,我認爲我會這樣做,這是一個生成的XML反序列化類,我不是很流利,我想我會讓B繼承謝謝所有的幫助,我覺得很蠢 – Gotti92

1

您可以限制允許的類型與where命令一個gernic:

public void Test<T>(T param) where T : TypeA { 
    ... 
} 

https://docs.microsoft.com/de-de/dotnet/csharp/language-reference/keywords/where-generic-type-constraint

但這只是簡單的限制,因此不會解決這個問題有兩個班,但這種情況下,你可以使用方法重載:

public void Test(TypeA param) { 
    ... 
} 
public void Test(TypeB param) { 
    ... 
} 

如果只有兩個班,我認爲這是最好的解決辦法因爲仿製藥沒有好處。

+0

感謝@ ctron,許多喜歡 – Gotti92

+0

OP指出它可以是一個_object_ 'TypeA'或'TypeB',所以我認爲'TypeA'和'TypeB'是引用類型。如果是這樣,這是不正確的C#。您不能將兩個引用類型添加到約束。這隻會在'TypeA'和'TypeB'是接口時才起作用。 –

+1

@ctron這將是解決方案,但是當我這樣做時TypeB給我一個錯誤,說它必須是第一個,反之亦然TypeA,如果我打開它,你知道爲什麼,或者該怎麼辦? – Gotti92