さて、私の水晶玉は修理中です。したがって、あなたがしようとしていることの私の推測は次のいずれかです:
- プロパティに動的にアクセスします。
- ジェネリック メソッドを動的に呼び出す
- オブジェクトのインスタンス化を動的に呼び出す
1)
dynamic dObj = bla;
dObj.Prop
2) 動的ジェネリック メソッド
// example looks close to yout issue, (checking removed for brevity)
// call method GetRespository<poco> dynamically on any object that implements ILuw
// the result passed back is also dynamic. For obvious reasons.
public static dynamic GetDynamicRepository(ILuw iLuw, string pocoFullName) {
//null checks removed for demo....
var pocoType = Type.GetType(pocoFullName);
MethodInfo method = typeof(ILuw).GetMethod("GetRepository");
MethodInfo generic = method.MakeGenericMethod(pocoType);
var IRepOfT = generic.Invoke(iLuw, null);
dynamic repOfT = IRepOfT;
return repOfT;
}
3) 動的な汎用インスタンスの作成、例はリポジトリのインスタンス化
public class RepositoryFactory<TPoco> where TPoco : BaseObjectConstraintHere {
public IRepositoryBase<TPoco> GetRepository(DbContext context) {
// get the Pocotype for generic repository instantiation
var pocoTypes = new[] {typeof (TPoco)}; // but you can also extend to <T,U>
Type repBaseType = GetRepositoryType(typeof(TPoco)); // get the best matching Class type
// now make one of those please..
IRepositoryBase<TPoco> repository = InstantiateRepository(context, repBaseType, pocoTypes);
return repository;
}
private Type GetRepositoryType(Type T) {
if (ConditionX) {
return typeof(RepositoryX<>);
}
return typeof (RepositoryY<>);
} // note you can return Repository<,> if the type requires 2 generic params
// Now instantiate Class Type with the Generic type passing in a constructor param
private IRepositoryBase<TPoco> InstantiateRepository(BosBaseDbContext context, Type repType, params Type[] pocoTypes) {
Type repGenericType = repType.MakeGenericType(pocoTypes);
object repInstance = Activator.CreateInstance(repGenericType, context);
return (IRepositoryBase<TPoco>)repInstance;
}
}