【问题标题】:c# constructor get 'base' part with reflectionc#构造函数通过反射获取'base'部分
【发布时间】:2021-10-05 06:13:46
【问题描述】:

我目前正在尝试解析一些随机 dll 的公共成员,我被困在使用反射获取构造函数的基础部分

public class MyClass: MySuperClass
 {
   public MyClass(Color color1, Color color2)
          : base(0.0f, 0.0f, 0.0f, 0.0f, color1, color2)
        {
           //...
        }
  }

从类型我知道如何获取构造函数和参数,但不是对父类构造函数的调用':base(0.0f,0.0f,0.0f,0.0f,color1,color2)'

var MyType = typeof(MyClass);
foreach (ConstructorInfo MyConstructor in MyType.GetConstructors())
{
     var MyParameters = MyConstructor.GetParameters();

     //todo get base parameters ': base(0.0f, 0.0f, 0.0f, 0.0f, color1, color2)' ? 
}

你知道是否有办法获取父构造函数调用中使用的参数/值列表吗?

【问题讨论】:

  • 我认为这是不可能的。反射让您了解课程的表面。基类调用或在其他情况下对同一类的其他构造函数的调用是构造函数方法的已实现主体的一部分。因此,您需要检查生成的 IL 代码以查看是否以及如何调用不同的方法。
  • 如果不反编译 CIL 主体,您将无法执行此操作。另外请注意,不仅可以调用基础构造函数。
  • 谢谢大家的回复,我去看看这个方法,看看能不能搞到什么

标签: c# .net reflection constructor


【解决方案1】:

您可以进入BaseType 并查看父类的构造函数,而不是进入MyClass 的类型:

Type mySuperClassType = typeof(MyClass).BaseType;
        foreach (ConstructorInfo MyConstructor in mySuperClassType.GetConstructors())
        {
            var MyParameters = MyConstructor.GetParameters();
            Console.WriteLine(MyConstructor.ToString());
            // prints Void .ctor(Single, Single, Single, Single, System.Drawing.Color, System.Drawing.Color) 
        }

这里的工作示例:https://dotnetfiddle.net/S7CFT0

【讨论】:

  • 这不能回答 OP 的问题
猜你喜欢
  • 1970-01-01
  • 2018-03-26
  • 1970-01-01
  • 2015-09-16
  • 2019-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-02
相关资源
最近更新 更多