2013-01-24 87 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

它基本上是一个对象,允许任何东西被调用,所以如果它是一个值类型,你必须处理那是的。 –