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
}

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

4

4 回答 4

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

于 2013-01-24T07:52:04.910 回答
1

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

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

    // other fields
}

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

于 2013-01-24T07:51:12.173 回答
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
}
于 2013-01-24T07:53:19.303 回答
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
}
于 2013-01-25T04:56:13.450 回答