Как я могу получить тип, который я хочу? - PullRequest
0 голосов
/ 03 июня 2010

В моем проекте есть 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; здесь нельзя использовать.

EDIT

Я пытаюсь решить это с помощью выражений.

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 ]

2 голосов
/ 03 июня 2010

Что вы собираетесь делать с предметом после его возвращения?

Если вызывающий код знает, что это такое, то его можно привести туда.

На самом деле вы взываете к интерфейсам здесь, так как возврат может быть приведен к известному интерфейсу, тогда могут быть вызваны соответствующие методы.

1 голос
/ 03 июня 2010

Нет способа получить проверку во время компиляции, если ваша строка "XXX" генерируется динамически (например, из пользовательского ввода), и, следовательно, нет никакого способа, чтобы o был чем-то, кроме object.

Если это жестко запрограммированная строка или если вы иным образом знаете тип в типе компиляции, вы можете выполнить приведение:

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