如何初始化泛型类的列表

本文关键字:列表 泛型类 初始化 | 更新日期: 2023-09-27 17:55:46

我有一个泛型类

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;
    }
}

我有一个包装类,它有一个元数据差异列表<>作为一个属性。

这不起作用:

找不到类型或命名空间名称"T"

法典:

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

如何初始化泛型对象的列表?可能吗?

如何初始化泛型类的列表

任一封闭类型都必须打开泛型:

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# 中,不能在非泛型类中保存泛型属性。这取决于您想要达到什么结果。

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

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

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

你可以

关闭它:

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
}

定义一个没有任何泛型类型的接口,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
}