我怎样才能得到我想要的类型?

时间:2010-06-03 11:05:15

标签: c# .net lambda expression

我的项目中有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,但是我如何编写它以适应其他情况?

由于没有解决方案,我将继续使用反射来操作返回对象......

2 个答案:

答案 0 :(得分:2)

一旦它被退回,你会对这件事做些什么?

如果加密代码知道它是什么,那么就可以在那里进行铸造。

你真的在这里为接口而烦恼,因为返回可以被转换为已知的接口,然后可以调用适当的方法。

答案 1 :(得分:1)

如果您的字符串“XXX”是动态生成的(例如,来自用户输入),则无法进行编译时检查,因此除o之外无法使object成为任何内容

如果它是一个硬编码的字符串,或者如果你知道类型为compile-type,你可以进行强制转换:

var o = (XXX)staticM.Invoke(...);