如何初始化泛型类的列表

时间:2013-01-24 07:50:06

标签: c# .net list generics

我有一个通用类

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列表&lt;&gt;作为财产。

这不起作用:

  

无法找到类型或命名空间名称“T”

代码:

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

    // other fields
}

如何初始化通用对象列表?有可能吗?

4 个答案:

答案 0 :(得分:2)

封闭类型必须打开通用:

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

    // other fields
}

或者您应该使用方法而不是属性:

public class DifferencesResult
{
    public IEnumerable<MetadataDifference<T>> GetMetadataChanges<T>();
    private void SetMetadataChanges<T>(IEnumerable<MetadataDifference<T>> value)

    // other fields
}

在C#中,您不能在非泛型类中保存泛型属性。 这取决于你想要达到的结果。

答案 1 :(得分:1)

在这里你应该使用封闭类型,例如:

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

    // other fields
}

因为你不能在非泛型类中拥有泛型属性。

答案 2 :(得分: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
}

答案 3 :(得分: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
}