【发布时间】:2010-06-03 11:05:15
【问题描述】:
我的项目中有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; 不能在这里使用。
编辑
我正在尝试用表达式解决它。
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,但是我该如何编写它以适应其他情况?
由于没有解决方案,我会继续使用反射来操作返回对象...
【问题讨论】:
-
如果你知道方法的返回类型,为什么不直接做
MyEntity o = (MyEntity) staticM.Invoke(...);呢?然后你会告诉编译器“我知道 o 是一个 MyEntity,让我这样对待它。” -
我只知道名字。那我能做什么?使用开关?
-
如果您只知道类的名称并且没有类层次结构,那么在这种情况下您只能转换为共同的父对象。
var只会转向反对。 -
Danny Chen:是的,事情变得更加困难。如果您无法更改实体类,那么一大堆旧的 if 子句可能是最快的解决方案。
标签: c# .net lambda expression