1
我想做一個類,它將繼承所有繼承特定接口的類,以便在由自定義實體框架模型觸發的事件中執行建設者。從通用接口調用另一種通用方法的結果的參數
我有什麼:
1)一種通用接口IOverride其有一個方法配置(EntityTypeConfiguration實體)
2)實現該接口的幾個類。
public class ItemOverride : IOverride<Item>
{
public void Configure(EntityTypeConfiguration<Item> entity)
{
// Do something with entity
}
}
3)收集它定義了接口的所有類和它們組合成這樣IOverride的列表的方法:
var list = (from x in assembly.GetTypes()
from z in x.GetInterfaces()
let y = x.BaseType
where
(y != null && y.IsGenericType &&
typeof (IOverride<>).IsAssignableFrom(y.GetGenericTypeDefinition())) ||
(z.IsGenericType &&
typeof (IOverride<>).IsAssignableFrom(z.GetGenericTypeDefinition()))
select z).ToList();
4)我儘量遵循了調用方法配置在事件...
var method = typeof (IOverride<>).GetMethod("Configure")
var entityMethod = typeof (DbModelBuilder).GetMethod("Entity");
foreach (var item in list)
{
var target = item.GetGenericArguments().Single();
var invoked = entityMethod.MakeGenericMethod(target).Invoke(args.ModelBuilder, new object[] {});
var func = method.MakeGenericMethod(item);
ModelCreating += (o, eventArgs) => func.Invoke(invoked, new object[] {});
}
但是,在運行實際的事件的時候,我得到一個
Additional information: Late bound operations cannot be performed on types or methods for which ContainsGenericParameters is true.
func.Invoke()行中的異常。我顯然做錯了什麼,但我不是100%確定它是什麼。我想,當我感覺天氣不好時,或許我做了一件非常愚蠢的事情,反思會使我感到困惑。無論如何,在正確的方向微調就足夠了。
你的回答使我真正的解決方案。然而,func()是不相關的,只需要調用method.Invoke(obj,new [] {invoked}); – NeroS