制約を汎用メソッドに追加して、ValueTypes、StringsまたはNullable値の型をチェックしています。ValueTypesのValueTypes、Strings、Nullableに対する一般的な制約
問題は、ということである。
- 値タイプは支柱が
- 文字列は不変の参照型は、
- null許容されている値型であるが、「S:構造体」に受け入れられないであろう型制約。
これを受け入れる方法があるかどうかは知っていますか、これらのタイプのみを一般的な制約に入れますか?
問題は、特定のオブジェクトのこれらの型のプロパティを表すExpression<Func<T, S>
パラメータを受け入れることを試みていることです。
機能は(コードはどんな意味をなすとちょうど私が探しているもののアイデアを得るために迅速なものではありません注意してください)、次のようになります。
public class Person
{
public string Name {get; set;}
public DateTime? DOB {get; set;}
public int NumberOfChildren {get; set;}
public Car CurrentCar {get; set;}
}
---
internal void MyGenericMethod<T, S>(T myObject, Expression<Func<T, S> property){...}
Person myPerson = new Person();
MyGenericMethod(myPerson, p => p.Name); //S would be a string
MyGenericMethod(myPerson, p => p.DOB); //S would be a DateTime?
MyGenericMethod(myPerson, p => p.NumberOfChildren); //S would be a struct
3つの呼び出し上記のすべてを受け入れますが、以下ではないする必要があります。事前に
MyGenericMethod(myPerson, p => p.CurrentCar); //S would be a class and shouldn't compile
おかげ
UPDATE:ありがとうアントンとマルク。 MyGenericMethodには、余分なパラメータを受け入れる4つの異なるシグネチャがあります。そのため、既存の4つの異なる(構造体、null可能な、文字列)を作成するというアイデアが気に入らないのです。
代わりに 'struct Holder'を定義することは意味があります。それはコンパイル時の「構文的砂糖」になります。その目的は、合法であるかどうかを指定することです。しかし、実行時の結果は効率的です - クラスに必要な割り当て/ガベージコレクションが不要になります。 – ToolmakerSteve