2013-10-22 28 views
1

我有一個問題,我有點難住這一個。這可能很容易,但我只是想念它。通用<T>和2基類繼承

如果我有一個類包含必要的結構和結構可以繼承。我需要一個通用的方法來傳遞並使用它。例如,假設我有一個從Test繼承的結構Test,Test-A。然後我有一個從Test-A繼承的MyTest和MyTest-B。

如何創建一個使用T的方法,以便我可以提供MyTest和MyTest-B,並且我可以在方法中使用它們中的任意一個?

所以:

public class Test 
{ 
    public int Hello {get; set; } 
} 

pubilc class Test-A : Test 
{ 
    public string Name { get; set; } 
} 

public class MyTest : Test-A 
{ 
    public string Last { get; set; } 
} 

public class MYTest-B : Test-A 
{ 
    public int Age {get; set; } 
} 

我需要一個像的方法:

private void MyList<T>(List<T> TestList) where T : **{not sure what this would be}** 
{ 
    TestList.Age = 10; 

    **OR** 

    TestList.Name = "Jane"; 
} 

如何還是我缺少什麼(或不理解),才能做到這一點?

任何援助將不勝感激。

+0

這會混淆你和許多人在這裏會恨我「因爲張貼這:) :)」,但c#允許動態。儘管避免使用它們,即使它們很酷很酷http://msdn.microsoft.com/en-us/library/dd264736.aspx –

+0

事件VB有一個變體類型和一個對象類型,但然後是有點冒險。現在C#4.0現在也有可選的參數方面。 – user2887486

+0

沒有風險沒有樂趣。我在開玩笑:) –

回答

4

沒有任何限制可以使用,它們可以匹配這兩種條件。處理這個問題的唯一方法是使用兩個重載方法,因爲沒有共享合同。

通用約束僅當存在共享其所有類型實現一個基類或接口工作,並使用相同的合同(即:兩者都具有NameAge屬性)。

+0

我正要寫一個答案,但你的很好,簡潔。 – slugster

+0

那麼有沒有在不使用繼承方面的情況下做到這一點?所以,我使用一個名單 TestList但沒有在哪裏。然後有反射或什麼決定使用**姓名**或**年齡**? – user2887486

+0

@ user2887486只是使用重載的方法 - 有一種方法,接受'列表'和一個單獨的方法,需要'列表'... –

0

如何創建使用T-這樣我就可以同時提供MyTest的和 MyTest的-B,我可以使用他們的方法的方法?

 **TestList.Age = 10;** 

    ... 

這將如何工作,如果你在MyTest類型的對象傳遞,因爲MyTest不具有Age財產?

+0

MyTest-B有年齡。 MyTest不。但是我正在考慮如何在IF Age的時候做一個泛型,然後我可以使用它,否則我顯然不能。 – user2887486