【问题标题】:How can I get the type I want?我怎样才能得到我想要的类型?
【发布时间】: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


【解决方案1】:

对象被退回后你打算怎么处理?

如果校准代码知道它是什么,那么它就可以在那里投射。

你真的很需要接口,因为可以将返回值强制转换为已知接口,然后可以调用适当的方法。

【讨论】:

    【解决方案2】:

    如果您的字符串“XXX”是动态生成的(例如,从用户输入),则无法在编译时检查,因此除了object 之外,没有办法让o 成为任何东西。

    但是,如果它是一个硬编码字符串,或者如果您以其他方式知道 compile-type 的类型,则可以进行强制转换:

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

    【讨论】:

    • 这不是硬编码字符串,所以我最后不能转换。
    猜你喜欢
    • 2020-09-11
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多