Activator
有一個創建具有默認構造函數的類型化實例的通用方法。通過它的外觀你有,那麼使用以下命令:
var obj = Activator.CreateInstance<LessonMapping>();
modelBuilder.AddConfiguration(obj);
如果不適合你,或者你需要傳遞參數給你的構造:最後,如果你是
var obj = (LessonMapping)Activator.CreateInstance(typeof(LessonMapping));
modelBuilder.AddConfiguration(obj);
把這個代碼內的另一個通用方法,你能有一個通用的替代LessonMapping等:
void DoSomethingGeneric<TEntity>(ModelBuilder builder)
{
var obj = Activator.CreateInstance<EntityTypeConfiguration<TEntity>>();
modelBuilder.AddConfiguration(obj);
}
編輯AddConfigurati的加反思在方法
爲了您AddConfiguration的方法的非通用用法,你將不得不使用反射來調用它:
void DoSomethingNonGeneric(ModelBuilder builder, Type entityType)
{
// make the generic type for the given entity type using the generic definition
var entityConfigType = typeof(EntityTypeConfiguration<>).MakeGenericType(new Type[] { entityType });
// instantiate the entity type configuration
var obj = Activator.CreateInstance(entityConfigType);
// get and make a generic method to invoke with the object above. Check the binding flags if it doesn't find the method
var methodDef = typeof(Extensions).GetMethod("AddConfiguration", BindingFlags.Static | BindingFlags.Public);
var method = methodDef.MakeGenericMethod(new Type[] { entityConfigType });
// and finally the end goal
method.Invoke(null, new object[] { builder, obj });
}
我在這一點上的假設是:
- 要傳遞實體的類型(而不是配置)。如果您要傳遞配置類的類型,請將參數名稱
entityType
更改爲entityConfigType
,並刪除生成泛型類型的第一行。請參閱下面的類型檢查代碼,以替代第一行。
- 您的擴展方法在名爲
Extensions
的類中。
- 您正在檢查類型是否符合
AddConfiguration(...)
的要求,因此您不會因使用錯誤的類型而獲得調用異常。下面再看看我通常會添加到這種非泛型方法的類型檢查示例。
- 設置
methodDef
的行按預期工作,因爲我目前無法測試它。
如果直接傳遞entityConfigType
並要檢查的類型,然後在第幾行補充一點:
if (!CheckDerivesFrom(typeof(EntityTypeConfiguration<>), entityConfigType)
throw new ArgumentException("entityConfigType");
而且某處創建檢查方法。我確定必須有一種更簡單的方法來測試一個類型是否來自給定的泛型定義,但我一直使用它,直到我看到更簡單的方式。
bool CheckDerivesFrom(Type baseType, Type typeToCheck)
{
if (!baseType.IsGenericDefinition)
return baseType.IsAssignableFrom(typeToCheck);
// assume typeToCheck is never a generic definition
while (typeToCheck != null && typeToCheck != typeof(object))
{
if (typeToCheck.IsGenericType && baseType.IsAssignableFrom(typeToCheck.GetGenericDefinition()))
return true;
typeToCheck = typeToCheck.BaseType;
}
return false;
}
你要投Activator.CreateInstance' – BradleyDotNET
是的'的結果,但我得到通過反射的類型和它有一個通用的'TEntity'所以我不知道該怎麼做 – RBasniak
的是創建對象一個'TEntity'? – InBetween