【问题标题】:Type.InvokeMember(..) in CoreCLRCoreCLR 中的 Type.InvokeMember(..)
【发布时间】:2015-11-18 15:20:05
【问题描述】:

我正在尝试使用 CoreCLR 动态调用特定类型的成员,但在针对 DNXCORE50 进行编译时,方法 Type.InvokeMember 不可用。但是,如果我针对 DNX451 进行编译,它可以正常工作。

下面是如何使用 DNX451 实现这一点的示例,但我如何在 DNXCORE50 中实现同样的目标?

using System;
using System.Reflection;

namespace InvokeMember
{
    public class Program
    {
        public void Main(string[] args)
        {
            typeof (Program).InvokeMember("DoStuff", BindingFlags.InvokeMethod, null, new Program(), null);
        }

        public void DoStuff()
        {
            Console.WriteLine("Doing stuff");
        }
    }

}

【问题讨论】:

    标签: c# reflection dnx coreclr


    【解决方案1】:

    使用此代码,它可以工作:

            MethodInfo method = typeof(Program).GetTypeInfo().GetDeclaredMethod("DoStuff");
            method.Invoke(new Program(), null);
    

    【讨论】:

    • 如果他抛出GetTypeInfo(),原始代码也应该可以工作。
    • @BenVoigt:GetTypeInfo().InvokeMember 不起作用。 “TypeInfo”不包含“InvokeMember”的定义,并且找不到接受“TypeInfo”类型的第一个参数的扩展方法“InvokeMember”(您是否缺少 using 指令或程序集引用?) InvokeMember.DNX Core 5.0
    【解决方案2】:

    对于可能一直使用 Type.InvokeMember() 和 BindingFlags.SetProperty 来设置对象属性(而不是 BindingFlags.InvokeMethod)的任何人,您可以使用此语法,该语法根据@aguetat 给出的答案稍作修改:

    PropertyInfo property = typeof(Program).GetTypeInfo().GetDeclaredProperty("MyProperty");
    property.SetValue(new Program(), newValue);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多