【问题标题】:Change the same property of different objects without a common baseclass?在没有公共基类的情况下更改不同对象的相同属性?
【发布时间】:2023-01-26 20:22:29
【问题描述】:

我找到了这个线程:How to change the same properties of different objects in one method?

但我有一个额外的要求:我不一定有对象的公共基类:

我希望使用一个函数更改更多对象的“字体”属性,但这些对象并非源自公共基类。

但是我敢肯定,它们都具有“字体”属性(或者以防万一,让我们删除编译时错误)。我应该如何在 C# 中使用 .NET Core7 执行此操作?

private void RescaleFont<?>(? control_with_font_attribute, double scale) {
  control_with_font_attribute.Font = ...;

【问题讨论】:

  • dynamic .......
  • RescaleFont( x =&gt; x.Font, scale ) 这样的东西适合你吗?
  • @Fildor:我需要对原始(x.Font)字体进行手动调整,这将导致我为 N 个对象复制粘贴我的长代码 N 次,我希望避免这种情况。 :)
  • 不是所有控件都继承自具有 Font 属性的 System.Windows.Forms.Contol 吗?
  • 我们不知道Font是否来自System.Windows.Forms ...

标签: c# object generics


【解决方案1】:

正如@Selvin 在他们的评论中已经暗示的那样: 使用 dynamic 关键字。

动态类型的对象绕过静态类型检查,并假定它支持操作或调用的属性。

如果有任何错误,您将在运行时得到一个异常。但是在编译时,一切看起来都“很好”。

您的方法如下所示:

private void RescaleFont(dynamic control_with_font_attribute, double scale)
{
    control_with_font_attribute.Font = ...;
}

但是请注意,我不太确定它的使用安全性或设计是否可以接受。

【讨论】:

  • 是的,这似乎有效,但是,如果“字体”属性不可用,我能以某种方式得到构建错误吗?
  • 简而言之@Daniel - 不。
【解决方案2】:

A、写两遍

方法写两遍。应该需要最少的重复:

private void RescaleFont(Type1 ctrl, double scale) 
{
  ctrl.Font = GetFont(scale));
}

private void RescaleFont(Type2 ctrl, double scale) 
{
  ctrl.Font = GetFont(scale));
}

请注意,只有设置字体是重复的,GetFont 没有重复,只是从两个地方调用。

B、添加接口

private void RescaleFont(IWithFont ctrl, double scale) 
{
  ctrl.Font = GetFont(scale));
}

C. Control.Font 属性

你确定你的控件不是从同一个基类继承的,比如System.Windows.Forms.Control

private void RescaleFont(System.Windows.Forms.Control ctrl, double scale) { ctrl.Font = GetFont(刻度)); }

【讨论】:

  • 是的,我希望避免重复,因为我有更多变体(第 3 方库)。
  • 恕我直言,有点重复明显好于dynamic
  • 对于 B:我无法修改 3rdparty 库;对于 C:不,它们不是从 Control 继承的。
猜你喜欢
  • 2021-01-08
  • 2018-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-01
  • 2020-02-22
  • 2018-11-03
相关资源
最近更新 更多