私の質問は、C#ジェネリックの「デフォルト」型パラメーターへの合理的なアプローチはありますか? に関連しています。、しかし、アプローチする内部ジェネリック クラスを使用しても機能しません。
次のようなコードが与えられた場合:
using System;
public class FooEventArgs<T> : EventArgs
{
// ... T properties and a constructor
}
public class Foo<T>
{
public delegate void EventHandler<FooEventArgs>(object sender, FooEventArgs<T> e);
public event EventHandler<FooEventArgs<T>> Changed
}
そして、それは次のように使用されます:
public class User
{
public Foo<int> foo1;
public Foo<object> foo2;
public User()
{
foo1 = new Foo<int>();
foo2 = new Foo<object>();
foo1.Changed += foo1_Changed;
foo2.Changed += foo2_Changed;
}
protected void foo1_Changed(object sender, FooEventArgs<int> e) { ... }
protected void foo2_Changed(object sender, FooEventArgs<object> e) { ... }
}
まあ、ジェネリックオプショナルがあればいいのですが、何かが入ってくるタイプがわからない場合が多いので。 (データは、独自の変数タイプを持つ外部システムから来ています。 、その後 .NET 型に変換されますが、たとえば、1 つのリモート データ型がいくつかの .NET 型のいずれかに変わる場合や、それが "any" 型である場合など、次のような状況に遭遇しますobject
。その場合の唯一の本当の答えです。)
私がすぐに思いついた解決策はサブクラス化でした(これは、以前にリンクされた質問の主な提案でもありました):
public class Foo : Foo<object>
{
public Foo(...) : base(...) { }
}
public class FooEventArgs : FooEventArgs<object>
{
public Foo(...) : base(...) { }
}
次に、次のように使用します。
public class User
{
public Foo foo3;
public User()
{
foo3 = new Foo();
foo3.Changed += foo3_Changed;
}
protected void foo3_Changed(object sender, FooEventArgs e) { ... }
}
問題は、それが自然にfoo3_Changed
受け入れられないことFooEventArgs
です; が必要です。これはFooEventArgs<object>
、Foo.Changed
イベントが渡されるものです (値は から取得されるためFoo<object>
)。
Foo.cs(3,1415926): error CS0123: No overload for 'foo3_Changed' matches delegate 'FooLibrary.Foo<object>.EventHandler<FooLibrary.FooEventArgs<object>>'
クラスの大部分を複製する以外に、これについてできることはありますか?
もう 1 つ試してみました: から に変換する暗黙の演算子FooEventArgs<object>
ですFooEventArgs
。
public static implicit operator FooEventArgs(FooEventArgs<object> e)
{
return new FooEventArgs(...);
}
残念ながら、これは機能していないようですが、理由はよくわかりません。
EditBuffer.cs(13,37): error CS0553: 'FooLibrary.FooEventArgs.implicit operator FooLibrary.FooEventArgs(FooLibrary.FooEventArgs<object>)': user-defined conversions to or from a base class are not allowed
それで、もう一度、これについて私にできることはありますか、それともそれはタフラックであり、使用するだけで満足する必要があると考えるのは正しいですFooEventArgs<object>
か(そして、使用するだけでよいと思いますFoo<object>
)?