2010-10-24 2 views
6

Я хочу создать анонимный тип внутри функции, когда свойства анонимного типа являются параметрами функции.Создайте анонимный тип из отражения ParamInfo []

например, для функции: private bool CreatePerson (строка FirstName, строка LasName, int Age, int height);

У меня будет анонимный тип со свойствами: FirstName, LasName, возраст и высота. , а значениями параметров функции будут значения свойств анонимного типа.

private bool CreatePerson(string FirstName, string LasName, int Age, int height) 
    { 
     // Get this method parameters 
     MethodBase currentMethod = MethodBase.GetCurrentMethod(); 
     ParameterInfo[] parametersInfo = currentMethod.GetParameters(); 

     // create an object of the parameters from the function. 
     foreach (ParameterInfo paramInfo in parametersInfo) 
     { 
      // add a property with the name of the parameter to an anonymous object and insert its value to the property. 
      // WHAT DO I DO HERE? 
      .... 
     } 

     return true; 
    } 
+0

Вы хотите создать анонимный тип с известными именами и типами полей, для чего вам нужно отражение? новый {FirstName = FirstName, ...} будет просто отлично? – SoftMemes

+0

Он хочет, чтобы это было определено во время выполнения - я верю. – Aliostad

+0

@Aliostad - но в описании просто указано, что _values_ должен исходить из параметров, имена параметров/свойств уже есть ... – SoftMemes

ответ

2

Если я правильно понял и вы хотите определить свойства во время выполнения, это невозможно. Хотя в анонимных типах вы можете создавать типы, которые вы определяете там, а затем, присваивая значения, имя свойств должно быть известно на этапе времени компиляции.

Фактически, тип указан для вас, но не для CLR. Если вы посмотрите на сборку в ildasm.exe или отражателе, вы увидите эти анонимные типы со странными именами, всегда имеющими <> в своих именах.

C динамических # 's может быть в состоянии помочь здесь, но, насколько я знаю, они помогают с общения с объектами, в том, что у нас нет информации о типе для, не создавая - но может быть так, что я делаю не знаю.

+0

Было бы вполне возможно использовать Reflection.Emit для генерации нового типа во время выполнения, но я не понимаю, почему вы хотели бы что-то вроде этого. – SoftMemes

+0

Правда, написание кода и компиляция - это всегда возможность, но это он не хочет делать. – Aliostad

+0

Reflection.Emit на самом деле не «написание кода и компиляция», поскольку нет исходного кода, но я согласен, что, скорее всего, он не то, что ему нужно. – SoftMemes

0

Не могли бы вы использовать шаблон дизайна «Linq to DataSet» Field<T>(String Name)? Фактически, почему бы просто не использовать DataTable. Компилятору не нужно знать, что поле существует, только тип, который должен быть безопасным по типу. Одной из причин этого было бы реализовать некоторый тип анализатора для создания фильтров или динамически настраивать имена полей.

Смежные вопросы