Создание динамического метода - PullRequest
3 голосов
/ 27 апреля 2010

Итак, я пытался исследовать это все утро, и мне не повезло. Я пытаюсь найти способ динамически создать метод / делегат / лямбду, который возвращает новый экземпляр определенного класса (неизвестный до времени выполнения), который наследуется от определенного базового класса.

Я могу гарантировать следующее о неизвестном / динамическом классе

  1. Он всегда будет наследоваться от одного известного класса (строки)
  2. В нем будет по крайней мере 2 конструктора (один принимает long, а другой - IDataRecord)

Я планирую назначить следующее:

  1. Поиск всех классов с определенным атрибутом
  2. Создание делегата / метода / лямбды / чего бы то ни было, создающего новый экземпляр класса
  3. Хранение делегата / чего-либо вместе с некоторыми свойствами в структуре / классе
  4. Вставить структуру в хеш-таблицу
  5. При необходимости вытащить информацию из хеш-таблицы и вызвать делегат / что угодно, чтобы получить новый экземпляр класса и вернуть его / добавить его в список / т. Д.

Мне нужна помощь только с № 2 выше !!! Я понятия не имею, с чего начать. Мне просто нужен справочный материал, чтобы начать работу, или ключевые слова, которые нужно добавить в Google.

Это для компактного / простого использования ORM для нашего офиса здесь. Я понимаю, что вышеупомянутое не просто, но однажды сработав, вы сделаете обслуживание кода невероятно простым.

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация! И заранее спасибо! :)

Ответы [ 2 ]

4 голосов
/ 27 апреля 2010

Вы можете использовать выражения LINQ для построения лямбды (long p) => new XXX(p) as Row во время выполнения:

Type type = // ...
ConstructorInfo ctor = type.GetConstructor(new Type[] { typeof(long) });

var p = Expression.Parameter(typeof(long), "p");
var expr = Expression.Lambda<Func<long, Row>>(
               Expression.TypeAs(
                   Expression.New(ctor, p),
                   typeof(Row)),
               p);

Func<long, Row> rowCreator = expr.Compile();

Row row = rowCreator(10);
3 голосов
/ 27 апреля 2010

а как же Activator.CreateInstance?

образец:

string typeName = ...;
Activator.CreateInstance(Type.GetType(typeName), params);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...