基本クラスで静的メソッドを作成するという要件に直面していますが、型引数を宣言する必要があるのは気に入らないので、これを正しい方法で実行しているかどうか疑問に思っています。
基本的に、クラスのプロパティに関連付けるデリゲートを割り当てます。次のように、継承されたクラスにメソッドを簡単に配置できます。
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インスタンスですが、それでもインスタンスです。