none
关于反射后类示例对象的强制转换的问题 RRS feed

  • 问题

  • 已知子类名"DerivedClass1"和基类BaseClass对象b;
    用下面语句根据子类名创建子类实例没有问题:
    object obj = asmb.CreateInstance("DerivedClass1", true, BindingFlags.CreateInstance, null, null, null, null);
    怎样把obj根据指定的基类名字符串强制转换为基类实例?
    dynamic d=Convert.ChangeType(obj, Type.GetType("BaseClassName")); 错误: Object必须实现IConvertible
    但是return obj as BaseClass; 调试是可以返回相应基类的,这说明.NET是有能力转换子类为基类类型的,只是ChangeType不适合这种场景。
    但是我想要的是根据基类名字符串转换为所需要的基类,我试过用GetType或typeof都不行。
    请问有没有什么办法实现?
    2022年7月20日 8:28

答案

  • 请到网上搜索关键词“c# 反射 实例化泛型”,然后写出类似于下面这样的代码。

    using System;
    using System.Reflection;
    namespace ConsoleApp1
    {
        class BaseClass
        {
            public void test()
            {
                Console.WriteLine("1234567890");
                Console.ReadLine();
            }
        }
        class DerivedClass1 : BaseClass { }
        internal class Program
        {
            public static T Cast<T>(object obj)
            {
                return (T)obj;
            }
            static void Main(string[] args)
            {
                object obj = Activator.CreateInstance(Type.GetType("ConsoleApp1.DerivedClass1"));
                MethodInfo method = typeof(Program).GetMethod("Cast", BindingFlags.Static | BindingFlags.Public);
                method = method.MakeGenericMethod(Type.GetType("ConsoleApp1.BaseClass"));
                var dyn = method.Invoke(null, new object[] { obj }) as dynamic;
                dyn.test();
            }
        }
    }

    2022年8月18日 19:17

全部回复

  • 这里这么冷清吗?
    2022年8月1日 2:24
  • 已知子类名"DerivedClass1"和基类BaseClass对象b;
    用下面语句根据子类名创建子类实例没有问题:
    object obj = asmb.CreateInstance("DerivedClass1", true, BindingFlags.CreateInstance, null, null, null, null);
    怎样把obj根据指定的基类名字符串强制转换为基类实例?
    dynamic d=Convert.ChangeType(obj, Type.GetType("BaseClassName")); 错误: Object必须实现IConvertible
    但是return obj as BaseClass; 调试是可以返回相应基类的,这说明.NET是有能力转换子类为基类类型的,只是ChangeType不适合这种场景。
    但是我想要的是根据基类名字符串转换为所需要的基类,我试过用GetType或typeof都不行。
    请问有没有什么办法实现?
    因为return obj as BaseClass不灵活,基类名是不固定的,需要用字符串变量来把基类名传递给.NET让它做出相应的转换。
    2022年8月17日 2:30
  • 请到网上搜索关键词“c# 反射 实例化泛型”,然后写出类似于下面这样的代码。

    using System;
    using System.Reflection;
    namespace ConsoleApp1
    {
        class BaseClass
        {
            public void test()
            {
                Console.WriteLine("1234567890");
                Console.ReadLine();
            }
        }
        class DerivedClass1 : BaseClass { }
        internal class Program
        {
            public static T Cast<T>(object obj)
            {
                return (T)obj;
            }
            static void Main(string[] args)
            {
                object obj = Activator.CreateInstance(Type.GetType("ConsoleApp1.DerivedClass1"));
                MethodInfo method = typeof(Program).GetMethod("Cast", BindingFlags.Static | BindingFlags.Public);
                method = method.MakeGenericMethod(Type.GetType("ConsoleApp1.BaseClass"));
                var dyn = method.Invoke(null, new object[] { obj }) as dynamic;
                dyn.test();
            }
        }
    }

    2022年8月18日 19:17
  • 谢谢您的解答!
    2022年8月26日 8:14