从反射ParamInfo[]创建匿名类型

7
我希望在函数内创建一个匿名类型,其中匿名类型的属性是函数参数。
例如,对于函数: private bool CreatePerson(string FirstName, string LasName, int Age, int height);
我将拥有一个具有属性FirstName,LasName,Age和height的匿名类型。函数参数的值将是匿名类型属性的值。
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;
    }

你想创建一个具有已知字段名称和类型的匿名类型,为什么需要反射?使用 new { FirstName = FirstName, ... } 就可以了吗? - SoftMemes
他想要在运行时定义它 - 我相信。 - Aliostad
@Aliostad - 但是描述只说明了 values 应该来自参数,参数/属性的名称已经存在... - SoftMemes
你为什么要这样做?因为这很难,而且可能是个坏主意。 - siride
2个回答

3
如果我理解正确,您想在运行时定义属性,这是不可能的。尽管在匿名类型中,您可以通过分配值来创建定义在那里的类型,但属性的名称必须在编译时已知。
实际上,对于CLR而言,该类型对您来说是匿名的,但并非如此。如果您使用ildasm.exe或reflector查看程序集,您将看到这些具有奇怪名称(名称中始终带有“<>”)的匿名类型。
C#的dynamic可能能够帮助解决这个问题,但据我所知,它们有助于与我们没有类型信息的对象进行通信,而不是创建对象——但可能有我不知道的方法。

使用Reflection.Emit在运行时生成新类型是完全可能的,但我不明白为什么你会想要像这样做。 - SoftMemes
编写代码和编译总是一种可能性,但这不是他想做的。 - Aliostad
Reflection.Emit并不是真正的“编写代码和编译”,因为没有源代码,但我同意这可能不是他所需要的。 - SoftMemes
你可以在C# 4.0中使用dynamic和ExpandoObject,但是(除非你使用Reflection.Emit),你仍然必须明确地操作传递给方法的参数,这可能不是@Rodniko想要的。所以一般来说我同意 - 没有没有大量不必要的“魔法”是做不到的。 - NOtherDev
感谢大家的帮助,顺便说一下,对象不必具有属性,我只能使用公共字符串变量。那么你是说没有办法从反射PropertyInfo数组中创建自己的对象吗?'A' - 你是说用Dynamic和ExpandoObject可以做到这一点吗?你所说的“仍然必须明确地操作传递给方法的参数”是什么意思? - Rodniko

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接