我的项目中有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”,我希望我能成为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,但是我如何编写它以适应其他情况?
由于没有解决方案,我将继续使用反射来操作返回对象......
答案 0 :(得分:2)
一旦它被退回,你会对这件事做些什么?
如果加密代码知道它是什么,那么就可以在那里进行铸造。
你真的在这里为接口而烦恼,因为返回可以被转换为已知的接口,然后可以调用适当的方法。
答案 1 :(得分:1)
如果您的字符串“XXX”是动态生成的(例如,来自用户输入),则无法进行编译时检查,因此除o
之外无法使object
成为任何内容
如果它是一个硬编码的字符串,或者如果你知道类型为compile-type,你可以进行强制转换:
var o = (XXX)staticM.Invoke(...);