【问题标题】:Set property that has no setter with an internal constructor使用内部构造函数设置没有设置器的属性
【发布时间】:2014-12-03 09:51:29
【问题描述】:

我有一个类似的问题,如本主题所述:Set C# Property that has no Setter 不同之处在于我的 Class 有一个内部构造函数,所以我必须创建一个这样的实例:

 var _TxObjectImpl = (TxObjectImpl) typeof (TxObjectImpl).GetConstructor(
                BindingFlags.NonPublic | BindingFlags.Instance,
                null, Type.EmptyTypes, null).Invoke(null);

类有两个属性:

 public string StringId
        {
            get
            {...
            }
         return str;
        }

public object PlanningRepresentation
        {
            get
            {
                return ...;
            }
        }

是否可以同时设置这些属性和调用上面的构造函数?

【问题讨论】:

  • 也许这有帮助:nuget.org/packages/Trespasser
  • 你为什么要这样做?因为您专门将该变量标记为readonly。显然,一旦在构造函数中设置它就无法更改
  • 所以你问如何构造和修改一个类,其作者在确保你不能构造或修改该类时遇到了麻烦?下一步是什么?那些作者提出一个新问题,他们可以在课堂上进行哪些更改以阻止您的代码工作?
  • @alexo 这个问题很不清楚,我反复读了好几遍才知道,但是不,另一个问题是关于让 StackTrace 属性返回一些不同的东西,并且很难做到- 在构造函数中编码堆栈跟踪。这个问题是当基类的构造函数不可访问时如何调整该代码工作。
  • @hvd ,问题是我的任务很紧急。我正在开发的软件的开发人员在同一家公司,但我等不及修补程序了;这只是一个临时解决方法。

标签: c# reflection constructor internal


【解决方案1】:

您不能从没有可访问的public 或protected 构造函数的基类派生您的类。

如果基类实现了一个接口,您可以使用decorator 模式并创建它的一个实例,并将反射作为新类的私有字段。

【讨论】:

  • 技术上你可以:只要类不是sealed,你可以从它派生,插入两个委托构造函数,每个委托给另一个。您还可以确保以可捕获的异常终止。如果您随后构造该类并捕获异常,则该类的某个对象在某处等待被垃圾回收。最后,重写析构函数以复活对象并使其在某处可用。 (请不要这样做,我只是说这是可能。)
  • @hvd 请注意问题中的异常实际上是无关紧要的,它是从链接问题中接受的答案中复制的,上面写着“不要那样做,创建自己的课程”
  • @PanagiotisKanavos 是的,很抱歉造成混乱,我简化了我的问题。
  • @hvd 如果我没记错的话,您指的是 Jon Skeet 最近的一篇博文中的技术。我同意,不要永远这样做。
  • @DamirArh 我想我是在 SO 上读到的,但如果它是 Jon Skeet 写的,我不会感到惊讶。
猜你喜欢
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多