6

ValueTypes、Strings、または Nullable 値の型をチェックするように、ジェネリック メソッドに制約を追加しようとしています。

問題はそれです:

  • 値の型は支柱です
  • 文字列は不変の参照型です
  • nullable は値型ですが、「where S : struct」型制約では受け入れられません。

一般的な制約でこれらの型のみを受け入れる方法があるかどうか、誰かが知っていますか?

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

前もって感謝します

更新: アントンとマークに感謝します。MyGenericMethod には、追加のパラメーターを受け入れる 4 つの異なる署名があります。そのため、既存の 4 つのそれぞれに対して 3 つの異なる (構造体、nullable、文字列) を作成するという考えは好きではありません。これは維持するのに悪夢です!

4

1 に答える 1

7

私が思いつくことができる唯一のものは、3つの関数のセットです(sans Expression<>stuff):

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

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

MyGenericFunction(string s)

更新メソッドにはさまざまなオーバーロードがあることを考えると、次のことを提案できます。

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);

それでも非常に面倒ですが、それでもうまくいくかもしれません。

于 2009-04-08T08:43:56.687 に答える