0

そのようなオープンジェネリック型パラメーターのデリゲートインスタンスを持つ方法はありますか?

Action<T> SomethingHappened;

コンパイラがエラーを出します。

私は2年ごとにこの質問をして忘れていたかもしれません。以前の同様の質問が見つからないので、とにかく質問しています。

私が本当にやろうとしているのはこれです:

Entity Frameworkでは、テーブルに新しい行が追加されたり、テーブルの既存の行のデータが変更されたりするたびに、関心のあるリスナーにそのようなものがあることを伝えることができるパブリッシャーの一般的なフレームワークを作成したいと思います。起こりました。

たとえば、パブリッシャーは、Customerテーブルへの新しい行の追加またはCustomerテーブルの変更について知りたいと思っているすべてのリスナーに通知する場合があります。

リスナーはロガー、メール送信者などです。

現在、私がしているのは応急修理ですが、よりタイプセーフなソリューションが必要です。これが私が現在行っていることです:

 public partial class DaEntities : ObjectContext
    {
        Action<object, ObjectStateEntry> EntityModified;
        Action<object, ObjectStateEntry> EntityDeleted;
        Action<object, ObjectStateEntry> EntityAdded;

    public override int SaveChanges(SaveOptions options)
        {
            var modifiedEntities = 
                 ObjectStateManager.GetObjectStateEntries(
                 System.Data.EntityState.Added | System.Data.EntityState.Modified);

            var deletedEntities = 
                 ObjectStateManager.GetObjectStateEntries(
                 System.Data.EntityState.Deleted);

            foreach (var entry in modifiedEntities)
            {
                var type = GetObjectType(entry.GetType());

                // fire delegates here
            }

            return base.SaveChanges(options);
        }
    }

上記のシナリオでは、次のようなものが必要です。

public static Action<T, ObjectStateEntry> EntityModified;
public static Action<T, ObjectStateEntry> EntityDeleted;
public static Action<T, ObjectStateEntry> EntityAdded;

そして、次のような一般的な方法を指し示すようにします。

public void SomethingHappenedToAnEntity<T, ObjectStateEntry>
    (T t, ObjectStateEntry e)
{
    // do stuff here
}
4

1 に答える 1

0

未定義の 'T' を使用しても意味がありません... - 本当に必要なのは、カスタム イベント引数です。ある時点で型を強制的に具象にする必要があるため、次のようにパラメーターを渡すことができます。

Action<object> SomethingHappened;

そして、コードを消費するメソッドに分岐させます...

または、ごまかすこともできますし、ダイナミック ディスパッチにタイプを試してもらいます (わずかなパフォーマンス コストで) - しかし、これは問題を押し進めるだけです...

void Main()
{
    dynamic objectToProcess = new Moop();

    DoStuff(objectToProcess); //Dynamic dispatch will pick the best match automatically
}

public void DoStuff(Moop obj)
{
    Console.WriteLine(obj.GetType());
}

public void DoStuff(Gloop obj)
{
    Console.WriteLine(obj.GetType());
}

public void DoStuff(Bloop obj)
{
    Console.WriteLine(obj.GetType());
}

public class Moop {}
public class Gloop {}
public class Bloop {}
于 2012-12-27T12:39:58.007 に答える