2013-01-24 118 views
1

的名單我有一個泛型類如何初始化一個泛型類

public class MetadataDifference<T> 
{ 
    public T NewMetadata { get; private set; } 
    public T OldMetadata { get; private set; } 
    // Other useful properties 

    public MetadataDifference(T newMetadata, T oldMetadata) 
    { 
     NewMetadata = newMetadata; 
     OldMetadata = oldMetadata; 
    } 
} 

我有具有作爲一個屬性MetadataDifference <>的列表包裝類。

這不起作用:

類型或命名空間名稱 'T' 找不到

代碼:

public class DifferencesResult 
{ 
    public IEnumerable<MetadataDifference<T>> MetadataChanges { get; set; } 

    // other fields 
} 

我如何初始化列表一個通用對象?可能嗎?

+1

由於'DifferencesResult'不是通用的,它應該知道'T'是什麼類型,例如:'IEnumerable > MetadataChanges {get;組; }' –

回答

0

定義不具有任何泛型類型MetadataDifference工具,以提供底層對象非類型化訪問的接口:

public interface IMetadataDifference 
{ 
    object NewMetadata { get; } 
    object OldMetadata { get; } 
} 

public interface IMetadataDifference<out T> : IMetadataDifference 
{ 
    new T NewMetadata { get; } 
    new T OldMetadata { get; } 
} 

public class MetadataDifference<T> : IMetadataDifference<T> 
{ 
    object IMetadataDifference.NewMetadata { get { return NewMetadata; } } 
    object IMetadataDifference.OldMetadata { get { return OldMetadata; } } 

    public T NewMetadata { get; private set; } 
    public T OldMetadata { get; private set; } 
    // Other useful properties 

    public MetadataDifference(T newMetadata, T oldMetadata) 
    { 
     NewMetadata = newMetadata; 
     OldMetadata = oldMetadata; 
    } 
} 

public class DifferencesResult 
{ 
    public IEnumerable<IMetadataDifference> MetadataChanges { get; set; } 

    // other fields 
} 
1

這裏你應該用一個封閉的類型,例如:

public class DifferencesResult 
{ 
    public IEnumerable<MetadataDifference<string>> MetadataChanges { get; set; } 

    // other fields 
} 

正如你不能在一個非泛型類的一般屬性。

+0

我希望能夠有一個列表,其中包含不同類型的對象 – Catalin

+0

@RaraituL可能'動態'是最接近的東西。但我不認爲這是使用它的情況。 – horgh

+0

或IEnumerable >' – Bazzz

2

無論是封閉類型必須打開通用:

public class DifferencesResult<T> 
{ 
    public IEnumerable<MetadataDifference<T>> MetadataChanges { get; set; } 

    // other fields 
} 

,或者你應該使用方法而不是屬性:

在C#中,你不能在非通用類持有通用屬性。 這取決於你想達到的結果。

1

你既可以關閉它:

public class DifferencesResult 
{ 
    public IEnumerable<MetadataDifference<{sometype}>> MetadataChanges { get; set; } 

    // other fields 
} 

或使用dynamic

public class DifferencesResult 
{ 
    public IEnumerable<MetadataDifference<dynamic>> MetadataChanges { get; set; } 

    // other fields 
} 
+0

我認爲動態是昂貴的,當我將box/unbox的值 – Catalin

+0

它基本上是一個對象,允許任何東西被調用,所以如果它是一個值類型,你必須處理那是的。 –