5

基本クラスで静的メソッドを作成するという要件に直面していますが、型引数を宣言する必要があるのは気に入らないので、これを正しい方法で実行しているかどうか疑問に思っています。

基本的に、クラスのプロパティに関連付けるデリゲートを割り当てます。次のように、継承されたクラスにメソッドを簡単に配置できます。

public class Foo 
{
   public string Property1 { get; set; }
}

public class InheritsFoo : Foo 
{
    public void AssignDel<TVal>(
        Expression<Func<InheritsFoo, TVal>> expr, 
        Action<InheritsFoo, TVal> action) 
    {
    }
}

または、拡張クラスで、これを行うことができます:

public static void AssignDel<T, TVal>(
    this T source, 
    Expression<T, TVal>> expression, 
    Action<T, TVal> action) 
    where T : Foo 
{
}

これらの両方によりAssignDel、インスタンス化されたクラスで使用できるようになります。

var foo = new InheritsFoo();
foo.AssignDel(x => x.Property1, handler);

AssignDelしかし、私には静的にする必要があります。これはそれを行う拡張方法を役に立たなくします。でも動作しますがInheritsFoo、これを基本クラスに移動したいと思います。試してみると、generics引数を推測できないため、メソッドの使用法を変更する必要があります。

InheritsFoo.AssignDel<InheritsFoo, string>(x => x.Property1, handler);

ここから抜け出す方法はありますか、私が考えていなかったこれを行う別の方法はありますか?

編集:拡張メソッドが機能するかどうかについてのコメントの問題に対処するために...私は@MarkMによって参照されるURLに行きました。私がそれをそのように書くと...

InheritsFoo foo = null;
foo.AssignDel(x => x.Property1, handler);

それはコンパイルされます(ただし、実行されるかどうかはわかりません)。それでも、「foo」は依然としてインスタンスと見なされるため、静的メソッドを使用する資格があるとは思わないでください。nullインスタンスですが、それでもインスタンスです。

4

3 に答える 3

1

ただし、AssignDelを静的にする必要があります。これはそれを行う拡張方法を役に立たなくします。InheritsFooでも機能しますが、これを基本クラスに移動したいと思います。試してみると、generics引数を推測できないため、メソッドの使用法を変更する必要があります。

これはあまり意味がありません。

InheritsFoo.AssignDel静的メソッドです。

InheritsFoo.AssignDel<InheritsFoo, string>(x => x.Property1, handler);要件を満たしているように見えることで、前述の静的メソッドを呼び出します。

あなたが思いついた2番目のオプションの何が問題なのかわかりません。それはあなたがする必要があることをします、何が起こっているのかは明らかです、それはあなたが合格InheritsFooしたからであり、string代わりに本当にfoo.AssignDel(x => x.Property1, handler);ですか?

あなたは単に次のことをして、あなたが望むことを達成することができるようです。

   public class Foo 
    {
       public string Property1 { get; set; }
    }

    public class InheritsFoo : Foo 
    {
        public static void AssignDel<TVal>(
            Expression<Func<InheritsFoo, TVal>> expr, 
            Action<InheritsFoo, TVal> action) 
        {
        }
    }

InheritsFoo.AssignDel(x => x.Property1, handler);あなたがまさにあなたが望むものであるそれを使うように思われるので、私は何かを逃しているに違いありません。

于 2012-05-18T17:24:57.317 に答える
1

拡張メソッドはすでに静的です。

拡張メソッドの方法で使用する必要がないと仮定すると、これは機能するはずです。

InheritsFoo.AssignDel(x => x.Property1, handler);

コンパイラが拡張メソッドフォームの型パラメータを推測するのと同じ方法で、昔ながらの静的な方法で推測します。

2つのタイプのパラメーターを持つメソッドが必要な場合は、次のジェネリッククラスを作成できます。

public class Foo<T> where T : Foo {

    public void AssignDel<TVal>( Expression<Func<T, TVal>> expr, Action<T, TVal> action) 
    {
         //...
    }
}

この場合、次のことができます。

Foo<InheritFoo>.AssignDel(x => x.PropertyFromInheritFoo, handler); 

ご覧のとおり、1つの型パラメーターを宣言するだけで、もう1つは推測されます。

それが役に立てば幸い

于 2012-05-18T17:29:19.013 に答える
0

継承チェーンに別のレベルを実装するだけで、必要なことを実行できました。

public class Foo  
{    
   public string Property1 { get; set; } 
} 

public class Foo<T> : Foo
{
   public static void AssignDel<TVal>(Expression<Func<T, TVal>> expr, Action<T, TVal> action)
   {   }
}

public class InheritsFoo : Foo<InheritsFoo>
{     } 

InheritsFooは必要に応じて扱うことができます。

于 2012-06-06T23:27:13.573 に答える