C# 编程指南:动态创建对象并调用其成员

在C#中,我们可以使用反射和动态类型来动态创建对象并调用其成员。动态创建对象和调用成员是一种在运行时根据需要创建和操作类型的机制。

部分
1
动态创建对象
使用 Activator.CreateInstance(Type type) 方法创建类型的对象实例。
使用 Activator.CreateInstance(Type type, object[] parameters) 方法创建类型的对象实例,并传递构造函数参数。
using System;

public class MyClass
{
    public string Name { get; set; }

    public MyClass()
    {
        Console.WriteLine("MyClass constructor called.");
    }
}

public class Program
{
    static void Main(string[] args)
    {
        Type myClassType = typeof(MyClass);

        // 创建对象实例(无参数构造函数)
        object myObject1 = Activator.CreateInstance(myClassType);

        // 创建对象实例(带参数构造函数)
        object myObject2 = Activator.CreateInstance(myClassType, new object[] { "John Doe" });
    }
}

在上述示例中,我们使用 Activator.CreateInstance 方法创建了 MyClass 类型的对象实例。第一个示例是调用无参数构造函数,第二个示例是调用带参数构造函数,并传递了一个字符串参数。

部分
2
动态调用成员
使用 Type.InvokeMember(string name, BindingFlags bindingFlags, Binder binder, object target, object[] parameters) 方法来调用对象的成员(方法、属性、字段等)。
using System;
using System.Reflection;

public class MyClass
{
    public string Name { get; set; }

    public void MyMethod(string message)
    {
        Console.WriteLine("MyMethod called with message: " + message);
    }
}

public class Program
{
    static void Main(string[] args)
    {
        Type myClassType = typeof(MyClass);
        object myObject = Activator.CreateInstance(myClassType);

        // 调用方法
        myClassType.InvokeMember("MyMethod", BindingFlags.InvokeMethod, null, myObject, new object[] { "Hello, World!" });

        // 设置属性值
        myClassType.InvokeMember("Name", BindingFlags.SetProperty, null, myObject, new object[] { "John Doe" });

        // 获取属性值
        object name = myClassType.InvokeMember("Name", BindingFlags.GetProperty, null, myObject, null);
        Console.WriteLine("Name: " + name);
    }
}

在上述示例中,我们使用 Activator.CreateInstance 方法创建了 MyClass 类型的对象实例。然后,我们使用 Type.InvokeMember 方法来调用对象的成员。 首先,使用 InvokeMember 方法调用了 MyMethod 方法,并传递了一个字符串参数。 接下来,使用 InvokeMember 方法设置了 Name 属性的值。 最后,使用 InvokeMember 方法获取了 Name 属性的值,并将其打印出来。 通过动态创建对象和调用成员,我们可以在运行时根据需要创建和操作类型的对象和成员。这在某些场景下非常有用,例如插件系统、动态加载程序集等。 需要注意的是,动态创建对象和调用成员使用了反射机制,可能会带来一定的性能开销。因此,在性能敏感的场景中应谨慎使用,并注意处理异常情况。

    目录

  • 1.
    动态创建对象
  • 2.
    动态调用成员