0

有没有办法像这样拥有一个开放的泛型类型参数的委托实例?

Action<T> SomethingHappened;

编译器给我一个错误。

我可能每两年问一次这个问题并忘记了。我找不到以前的类似问题,所以我还是问了。

我真正想做的是:

在实体框架中,我希望每当向表中添加一些新行或修改表中现有行中的某些数据时,我想编写一个通用的发布者框架,它可以告诉任何感兴趣的听众,这样那样的事情已经发生了。

例如,发布者可能会告诉所有有兴趣了解 Customer 表中的任何新行添加Customer表中的任何修改的听众。

侦听器可能是记录器、电子邮件发送者等。

目前,我正在做的是一个 kludge,但我想要一个更安全的解决方案。这是我目前正在做的事情:

 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 回答