2009-04-08 11 views
6

制約を汎用メソッドに追加して、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可能な、文字列)を作成するというアイデアが気に入らないのです。

答えて

7

私が思い付くことができる唯一のことは、次の3つの機能(サンセリフExpression<>もの)のセットです:メソッドのさまざまなオーバーロードがあることを考えると

MyGenericFunction<T>(T t) 
    where T : struct 

MyGenericFunction<T>(T? t) 
    where T : struct 

MyGenericFunction(string s) 

UPDATE、私がお勧めすることができます:

class Holder 
{ 
    private object value; 

    public Holder(object value) 
    { 
     this.value = value; 
    } 

    public static implicit operator Holder(DateTime dt) 
    { 
     return new Holder(dt); 
    } 

    public static implicit operator Holder(string s) 
    { 
     return new Holder(s); 
    } 

    // Implicit conversion operators from primitive types 
} 

したがって、あなたの方法は

MyGenericMethod(Holder h); 
なり、

まだ非常に扱いにくいですが、うまくいく可能性があります。

+0

代わりに 'struct Holder'を定義することは意味があります。それはコンパイル時の「構文的砂糖」になります。その目的は、合法であるかどうかを指定することです。しかし、実行時の結果は効率的です - クラスに必要な割り当て/ガベージコレクションが不要になります。 – ToolmakerSteve

関連する問題