【问题标题】:Create an anonymous type from reflection ParamInfo[]从反射 ParamInfo[] 创建一个匿名类型
【发布时间】:2011-04-29 19:49:35
【问题描述】:

当匿名类型属性是函数参数时,我想在函数内部创建一个匿名类型。

例如,对于函数: 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, ... } 可以吗?
  • 他希望在运行时定义 - 我相信。
  • @Aliostad - 但描述只是说明 应该来自参数,参数/属性的名称已经存在...
  • 你为什么要这样做?这样做很难,因为这可能是个坏主意。

标签: c# reflection types anonymous


【解决方案1】:

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

事实上,该类型对您来说是匿名的,但对 CLR 却不是。如果您查看 ildasm.exe 或反射器中的程序集,您会看到这些具有奇怪名称的匿名类型总是在其名称中包含 <>

C# 的动态可能在这里有所帮助,但据我所知,它们有助于 对象进行通信,这些对象是我们没有类型信息的对象,而不是创建对象 - 但可能存在我不知道的方式。

【讨论】:

  • 虽然在运行时使用 Reflection.Emit 来生成新类型是完全可能的,但我不明白为什么你会想要这样的东西。
  • 没错,写代码和编译总是有可能的,但这不是他想做的。
  • Reflection.Emit 并不是真正的“编写代码和编译”,因为没有源代码,但我同意这很可能不是他需要的。
  • 您可以使用 C# 4.0 中的 dynamic 和 ExpandoObject,但是(除非您使用 Reflection.Emit)您仍然必须显式操作传递给该方法的参数,我相信这不是 @Rodniko 想要的.所以总的来说我同意 - 如果没有很多不必要的“魔法”,就没有办法做到这一点。
  • 感谢大家的帮助,顺便说一句,对象不必具有属性,我只能使用公共字符串变量来解决。所以你是说没有办法从反射 PropertyInfo 数组中创建我自己的对象? 'A' - 你是说有办法用 Dynamic 和 ExpandoObject 做到这一点吗? “仍然必须显式操作传递给方法的参数”是什么意思?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2016-12-13
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2010-09-11
    • 2023-03-13
    相关资源
    最近更新 更多