2

最初のコード例は不可欠だと思います。ドロップダウン コントロールが必要なすべてのプロパティに使用するビュー モデルを構築しようとしていますが、これが始まりです。

public class ListProperty<TListItem, TValue>
{
    private readonly string _valuePropertyName = "Id";
    private readonly string _textPropertyName = "Name";

    public TValue Value { get; set; }
    private IEnumerable<TListItem> _list;
    public ListProperty(IEnumerable<TListItem> list)
    {
        _list = list;
    }
}

が参照型の場合、基になる型は になりますがValue、が値型の場合、基になる型は である必要があります。TValueTValueTValueNullable<TValue>

詳細:これが必要な理由は、Valueプロパティが割り当てられているかどうかを知るためです。私の要件なしでこれを行うには、 value as と入力する必要があり、私Objectには悪臭がします。

4

5 に答える 5

3

これは不可能です。C# の null 許容構文T?は (ほとんどの場合) のショートカットですSystem.Nullable<T>。の参照型は許可System.NullableされませんT?そのため、参照型である可能性がある (ジェネリック) 型には適用できません。ただし、制限できますTValuestruct

または、Nullable参照型を許可する独自のヘルパー構造体を作成することもできます。

于 2012-07-13T18:36:43.653 に答える
1

シンプルで短い:さまざまな場所でさまざまなバージョンをインスタンス化する必要があるので、なぜですか

ListProperty<SomeListItemType, SomeReferenceType>

ListProperty<SomeOtherListItemType, SomeValueType?>

適切な場において?しかし、多分私は何かが間違っています...

于 2012-07-13T18:44:22.873 に答える
1

それらを異なるクラスに分割してみることができます:

public abstract class ListProperty<TListItem, TValue> {
  public TValue Value { get; set; }
  ...
}

public class RefListProperty<TListItem, TValue> : 
  ListProperty<TListItem, TValue> where TValue : class {
}

public class ValListProperty<TListItem, TValue> : 
  ListProperty<TListItem, Nullable<TValue>> where TValue : struct {
}
于 2012-07-13T18:37:45.240 に答える
1

私が考えることができる最善の方法は、3 つのパラメーターを渡し、いずれか一方を渡すことです。

public class ListProperty<TListItem, TValueStruct, TValueClass> 
where TValueStruct : struct
where TValueClass : class
{

}
于 2012-07-13T18:40:00.417 に答える
0

私はあなたの問題を理解しているかどうかわかりませんが、あなたのクラスが現在の状態であるためTValue、null 許容型を含む任意の型を に使用できます。

new ListProperty<string, string>(someList1);    // reference type: string
new ListProperty<string, DateTime?>(someList2); // nullable value type: DateTime?
new ListProperty<string, DateTime>(someList3);  // non-null value type: DateTime

最後の使用のみを防ぎたい場合TValueは、クラス宣言で制約 on では無理だと思います。ただし、次のような静的コンストラクターを追加することで、チェック ランタイムを作成できます。

static ListProperty()
{
  if (default(TValue) != null)
    throw new ArgumentException("Type argument must allow null", "TValue");
}
于 2012-07-13T20:41:17.647 に答える