2

私は2つのクラスを持ってGenericNameValueおりSpecificNameValue、から継承していGenericNameValueます。

パラメータを取る関数がありますList<GenericNameValue>。合格できるようにしたいList<SpecificNameValue>です。この関数は、 の特別なプロパティに対して何も行いませんSpecificNameValue

これを行うための最良の方法は何ですか?

public class GenericNameValue
{
    public string FieldName{get;set;}
    public string FieldValue{get;set;}
}

public class SpecificNameValue : GenericNameValue
{
    public string SpecificFieldValue{ get; set; }
}

public static UtitlityClass
{
    public string CombineAllFields(List<GenericNameValue> mylist)
    {
        //.... do stuff with each item
    }
}

//......Example of calling the utilityclass
string stuff = UtilityClass.CombineAllFields(mySpecificNameValue);

不足している特定の構文はありますか?Abstracts のような別のものを使用する必要がありますか?

申し訳ありませんが、これは私がしばらく頭を悩ませていたものの 1 つにすぎず、エレガントな解決策が必要です。

4

2 に答える 2

6

List<T>は共変ではありません。あなたのメソッドはIEnumerable<>:

  public string CombineAllFields(IEnumerable<GenericNameValue> mylist)
  {
      .... do stuff with each item
  }

ライブラリからの完全な定義:

public class List<T> : IList<T> { }
public interface IList<T> : IEnumerable<T> { }
public interface IEnumerable<out T> { }

outダウンキャストは、その修飾子を使用するインターフェイスでのみ機能することに注意してください。

List<T>またはIList<T>パラメーターのいずれかを使用すると、メソッドでリストを変更できることを考慮してください。削除は問題ではありませんが、 aGenericNameValueに a を追加しないようにする必要がありList<SpecificNameValue>ます。IEnumerable<>コレクションに追加できないため、共分散は安全です。

于 2013-09-27T16:16:19.203 に答える
1

Henk Holtermanの答えは間違いなく進むべき道です。

を使用するように設定されている場合、List<T>または.NET 2.0または3.0を使用している場合は、制約付きのジェネリック パラメーターを使用するオプションがあります。

public static string CombineAllFields<T>(List<T> mylist) where T : GenericNameValue
{
    //.... do stuff with each item
}
于 2013-09-27T16:31:01.330 に答える