簡體   English   中英

轉換為基類時檢索通用對象類型

[英]Retrieve generic object type when casted to base class

我有以下情況:

 public interface IBaseType
 {
      public void InterfaceMethod ()
 }

 public class MyType<T> : IBaseType
 {
    public void InterfaceMethod () {};
    public string DoSomething () 
    {  
       if ( typeof(T) == typeof(string) ) return "String";
       if ( typeof(T) == typeof(int) ) return "Int";
       ... so on
    }
 }

 List<IBaseType> list = new List<IBaseType> ();

 list.Add ( new MyType<int> () );
 list.Add ( new MyType<long> () );
 list.Add ( new MyType<string> () );

現在如何訪問列表元素時檢索正確的泛型?

范例:

 IBaseType element = list[1] ;
 //here i would cast back element to MyType<long> type beacuse i would use method DoSomething()

在此先感謝您的幫助,對於我的英語不好,我們深表歉意。

一種簡單的處理方法是將Type屬性添加到IBaseType

public interface IBaseType
{
    void InterfaceMethod ();
    Type GenericType { get; }
}

然后,在您覆蓋的類中:

public class MyType<T> : IBaseType
{
    public Type GenericType { get { return typeof(T); }
}

您還可以在運行時使用Type.GetGenericArguments查找通用類的Type,但這將涉及使用反射的性能損失。

我同意評論員Lasse V. Karlsen的觀點:如果您要進行顯式類型檢查並在泛型類(或任何類中)中有條件地執行代碼,則設計存在根本性的錯誤。

沒有更多的上下文,很難確定要在這里做什么。 但是似乎您有一個IBaseType實例列表,只有其中一些是實現DoSomething()類型(否則,該方法將在接口中,對嗎?)。

在那種情況下,我認為您應該做的是引入一個中間類型,所有顯式類型(即非泛型 )的類都可以從中繼承:

interface IBaseType { void InterfaceMethod(); }

abstract class MyType : IBaseType
{
    public void InterfaceMethod() { ...implementation here... }

    public abstract string DoSomething();
}

然后,您將擁有單獨的子類,每個子類一個:

class MyTypeInt32 : MyType
{
    public override string DoSomething() { return "Int32"; }
}

class MyTypeString : MyType
{
    public override string DoSomething() { return "String"; }
}

// etc.

然后,您可以執行以下操作:

IBaseType element = list[1];

MyType myTypeElement = element as MyType;

if (myTypeElement != null)
{
    string result = myTypeElement.DoSomething();
}

那將是正確使用多態性。 請注意,幾乎完全缺少特殊情況,類型特定的代碼。 上面僅使用類型系統本身來組織特定於類型的邏輯。

最后,我會注意到,如果碰巧InterfaceMethod()也是每個類型的不同實現,那么您應該只制作一個IMyType接口而不是抽象類,因為每個特定於類型的類都是實際接口實現的地方應該去。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM