簡體   English   中英

從System.Type創建通用委托實例

[英]Make a generic delegate instance from a System.Type

有沒有辦法像這樣擁有開放的泛型類型參數的委托實例?

Action<T> SomethingHappened;

編譯器給我一個錯誤。

我可能每兩年問一次這個問題,而忘記了。 我找不到以前的類似問題,所以無論如何我都在問。

我真正想做的是:

在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
}

擁有未定義的'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 {}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM