2010-10-24 35 views
6

我想创建一个匿名类型内的函数,当匿名类型属性是函数参数。从反射创建一个匿名类型ParamInfo []

例如,对于函数: private bool CreatePerson(string FirstName,string LasName,int Age,int height);

我将有一个匿名类型的属性:名字,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 2010-10-24 13:06:16

+0

他希望在运行时定义 - 我相信。 – Aliostad 2010-10-24 13:10:03

+0

@Aliostad - 但描述只是说_values_应该来自参数,参数/属性的名称已经存在... – SoftMemes 2010-10-24 13:12:01

回答

2

如果我理解正确并且想在运行时定义属性,这是不可能的。虽然在匿名类型中,您可能能够创建在那里定义的类型,然后通过分配值,但必须知道属性的名称,编译时间为,编号为

其实,类型是匿名的,但不是CLR。如果您在ildasm.exe或反射器中查看程序集,则会看到这些匿名类型的名称中始终有<>

C#的动态或许能在这里帮助,但据我所知,他们与帮助对象是我们没有类型信息沟通,没有创造 - 但也有可能是一种方式,我做的不知道。

+0

尽管可以在运行时使用Reflection.Emit生成新类型,但我看不出为什么要这样。 – SoftMemes 2010-10-24 13:09:34

+0

诚然,编写代码和编译总是可能的,但这不是他想要做的。 – Aliostad 2010-10-24 13:12:01

+0

Reflection.Emit并不是真的“编写代码和编译”,因为没有源代码,但我同意这很可能不是他所需要的。 – SoftMemes 2010-10-24 13:20:06

0

难道你不能使用“Linq to DataSet”Field<T>(String Name)设计模式吗?实际上,为什么不使用DataTable?编译器不需要知道该字段是否存在,只需知道类型安全的类型即可。这样做的一个原因是实现某种类型的解析器来生成过滤器,或动态配置字段名称。