代码之家  ›  专栏  ›  技术社区  ›  Cheng Chen

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

  •  0
  • Cheng Chen  · 技术社区  · 14 年前

    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!
    

    如果我一开始通过了“我的实体”,我希望我能得到o作为我的实体! 请注意 我只知道“班名”。 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 回复  |  直到 14 年前
        1
  •  2
  •   cjk    14 年前

    一旦obejct被归还,你打算怎么处理它?

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

    你真的在为

        2
  •  1
  •   lc.    14 年前

    如果您的字符串“XXX”是动态生成的(例如,从用户输入),则无法获得编译时检查,因此无法 o 决不是 object

    如果是硬编码字符串,或者 知道

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