4

私はLINQに少し似たシステムを構築していて、それを実行する際に、ポリモーフィックコールバックハンドラーリストをサポートしようとしていますが、いくつかの種類の問題が発生しています。私の質問をする簡単な方法は、コードを表示することです。私の新しいシステムは「グループ」をサポートし、グループにはエントリポイントのベクトル(以下、UPDATEとCHECKPT)があり、ベクトルの各要素はデリゲートの多形リストであり、リフレクションを使用してコールバックします。

したがって、サンプルコード:

namespace ConsoleApplication1
{

    internal delegate void GroupISDHandler(int i, string s, double d);
    class Group
    {
        public class myHandlers {
            internal List<Delegate> hList = new List<Delegate>();
            public static myHandlers operator +(myHandlers a, Delegate b) {
                a.hList.Add(b);
                return a;
            }
        }

        public class mimicVector {
            public List<myHandlers> ListofhLists = new List<myHandlers>();
            public myHandlers this[int i] { get { return ListofhLists[i]; } set { ListofhLists[i] = value; } }
        }

        public mimicVector handlers = new mimicVector();

        public Group(string name) { ... }
    }

    class Program
    {
        internal const int UPDATE = 0;
        internal const int CHECKPT = 1;

        public static void Main()
        {
            Group g = new Group("group name");
            g.handlers[UPDATE] += (GroupISDHandler)delegate(int x, string s, double d) {
                Console.WriteLine("my int,string,double handler was called, with x = {0}, s = {1}, d = {2}", 
                     x,s,d);
            };
        }
    }
}

私の質問は登録ラインに集中しています。キャストと新しいデリゲートタイプを完全に省略できるように、C#でタイプを推測できないのはなぜですか?からだと思います

 g.handlers[UPDATE] += delegate(int x, string s, double d) {
     Console.WriteLine(....);
 };

C#は、必要な型シグネチャを推測できます。デリゲート()は一種の匿名タイプであり、C#は次のようなものを生成します

private delegate void _atype1(int _a0, string _a1, double _a2)

(Delegate)(_atype1)次に、行をコンパイルする前に挿入します。したがって、私のユーザーはデリゲート型を宣言する必要はありません(これにより、現在、引数リストを2回入力する必要があります)。

VS 2010を使用しているので、持っていますSystem.Linq。したがって、LINQが必要なキャストを何らかの方法で推測できる場合は...

4

2 に答える 2

2

あなたはこのようにそれを行うことができるはずです:

g.handlers[UPDATE] += (GroupISDHandler)((x, s, d) => Console.WriteLine( "my int,string,double handler was called, with x = {0}, s = {1}, d = {2}", x, s, d));

別のオプションは次のとおりです。

「Parameters」という名前のクラスがあります。これは、ユーザーが送信できるものすべてのコンテナーであり、変更されない場合はタイプが定義され、異なる量のパラメーターを送受信するふりをする場合はオブジェクトのリストになります。次に、デリゲートの代わりに、1つの引数を取るデリゲートに等しいアクションを実行し、次のようにキャストせずに呼び出しを行うことができます。

p => Console.WriteLine( "x = {0}、s = {1}、d = {2}"、px、ps、pd);

于 2010-12-11T17:35:32.613 に答える
0

答えは基本的にこれです:私が考えていた種類の状況で推論を行うことができますが、C#の所有者は完全に一般的な解決策を望んでおり、ポリモーフィズムは型推論の問題を十分に一般的な方法で解決するのを難しくします。彼らの見解。すべての型署名を2回入力することになったので、私自身は同意しませんが、それが彼らの理由です。

于 2012-01-02T18:25:16.413 に答える