В моем проекте есть a lot
таких классов (очень старый и стабильный код, я не могу внести в них много изменений, возможно небольшие изменения в порядке )
public class MyEntity
{
public long ID { get; set; }
public string Name { get; set; }
public decimal Salary { get; set; }
public static GetMyEntity ( long ID )
{
MyEntity e = new MyEntity();
// load data from DB and bind to this instance
return e;
}
}
По некоторым причинам, теперь мне нужно сделать это:
Type t = Type.GetType("XXX"); // XXX is one of the above classes' name
MethodInfo staticM= t.GetMethods(BindingFlags.Public | BindingFlags.Static).FirstOrDefault();// I'm sure I can get the correct one
var o = staticM.Invoke(...); //returns a object, but I want the type above!
Если я сдам "MyEntity" в начале, я надеюсь, что смогу получить o как MyEntity! Пожалуйста, обратите внимание , что я знаю только "имя класса". MyEntity e = staticM.Invoke(...) as MyEntity;
здесь нельзя использовать.
EDIT
Я пытаюсь решить это с помощью выражений.
ParameterExpression[] parameterExps = (from p in staticM.GetParameters()
select Expression.Parameter(p.ParameterType, p.Name)).ToArray();
MethodCallExpression methodCallExp = Expression.Call(staticM, parameterExps);
BlockExpression blockExpression = Expression.Block(methodCallExp);
LambdaExpression lambdaExp = Expression.Lambda(blockExpression, parameterExps);
var d = lambdaExp.Compile() as Func<XX1,XX2>;
В примере MyEntity XX1 будет длинным, XX2 будет MyEntity, но как я могу написать его для других случаев?
Поскольку решений нет, я продолжу использовать отражение для управления возвращаемым объектом ...