簡體   English   中英

方法調用通過反射檢索的變量類型

[英]Method calls on variable type retrieved through reflection

作為為早期問題創建解決方法的努力的一部分,我有一個Type列表,我(在一個完美的世界中)想要執行以下代碼:

foreach (Type entityType in entityTypes)
{
    modelBuilder.Entity<entityType>()
        .Map(m => m.Requires("Deleted").HasValue(false))
        .Ignore(m => m.Deleted);
}

顯然,因為我們不能以這種方式使用變量類型,所以我必須使用反射。 到目前為止,我能夠調用第一個方法.Entity()

foreach (Type entityType in entityTypes)
{
    var modelEntity = typeof (DbModelBuilder)
        .GetMethod("Entity")
        .MakeGenericMethod(new[] {entityType})
        .Invoke(modelBuilder, null);
}

但是,我仍然需要在modelEntity上調用.Map().Ignore() ,它的類型為EntityTypeConfiguration<T> 這就是我的問題所在,因為我知道(在運行時) TentityType類型,但我不能簡單地調用以下代碼:

foreach (Type entityType in entityTypes)
{
    var modelEntity = typeof (DbModelBuilder)
        .GetMethod("Entity")
        .MakeGenericMethod(new[] {entityType})
        .Invoke(modelBuilder, null);

    var mappedEntity = typeof (EntityTypeConfiguration<entityType>)
        .GetMethod("Map")
        .MakeGenericMethod(new[] {entityType})
        .Invoke(modelEntity, <parameters>);
}

因為我再次.Entity()同樣的問題,為什么我首先使用反射來調用.Entity() 我可以再次使用反射來調用這兩種方法,還是可以使用其他方法直接在modelEntity上調用它們?

解決此問題的一種方法是創建自己的通用方法,將三個調用合並為一個,並使用反射調用您的方法,如下所示:

void LoopBody<T>() { // Give the method a better name
    modelBuilder.Entity<T>()
        .Map(m => m.Requires("Deleted").HasValue(false))
        .Ignore(m => m.Deleted);
}

現在您可以從循環中調用此方法:

foreach (Type entityType in entityTypes) {
    GetType().GetMethod("LoopBody")
        .MakeGenericMethod(new[] { entityType })
        .Invoke(this, null);
}

暫無
暫無

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

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