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 に答える