c# - "Merging"类型,不使用反射或重复代码?

标签 c#

抱歉,我似乎想不出一个好的标题。随意更改为更合适的内容;我将不胜感激。

我在这里处于一个不寻常的位置(或者也许不是那么不寻常)。我有一个基本类型,从中可以分支出许多扩展其功能但保持相当一致的类型。其中一些或多或少是重复的,但以不同的方式呈现数据。它们都可以以大致相同的方式进行管理,因此我决定创建一个“合并”类,该类将采用两个或多个这些对象并允许同时控制它们,但我已经诉诸于使用反射。如果我要重新定义基类的所有成员并简单地重定向所有 set/gets/etc,这显然是错误的,因为如果基类为我要“合并”的类型不断变化,合并类也必须如此。

但这会导致性能成本,我相信这是可以避免的。性能下降不仅来自反射,还来自反射期间可预测的装箱/拆箱。

这是我正在做的伪代码示例:

class SomeBase
{
    public virtual bool SomeBool { get; set; }
}

class SomeDerived : SomeBase
{
    // ... extends SomeBase
}

class SomeMerger
{
    private SomeBase[] collection;

    public SomeMerger(SomeBase[] collection)
    {
        this.collection = collection;
    }

    public void SetProperty(string propertyName, object value)
    {
        for (int i = 0; i < this.collection.Length; i++)
        {
            PropertyInfo pi = collection[i].GetType().GetProperty(propertyName, BindingFlags.Public | BindingFlags.Instance);
            if (pi != null)
                pi.SetValue(collection[i], value, null);
        }
    }

    // .. etc
}

现在,我想要能够做的是访问成员,就好像它们是合并类中的单个实体一样(例如“SomeMergerObject.SomeBool = true”将设置所有它合并所有对象中的 SomeBool 属性为 true,使语法更加自然)。但是,我认为这样做的唯一方法是重新定义基类的所有方法和属性并将调用重定向到它们(我认为这不正确)。有没有更干净/更好的方法来实现这一目标?

抱歉,如果我解释得不好。如果你感到困惑,请大声喊出来,我会尽力澄清。 :)

编辑:

我想我需要澄清一下。我想当我说“我有这个基本类型等”时,我是有误导性的——实现是原样的,不是我的,我想做的就是让它更容易与. 一起工作。我认为这将是一个很好的功能(尽管是一个微不足道的功能,并且比它的值(value)更多的工作......但出于好奇心,为什么不探索这个想法?)让一组对象表现得像一个对象。这甚至不是一个问题,只是一个我想调情的改进想法。

我并不是在建议“一种新的语言功能”,我的问题语气是有没有办法做到这一点,一种干净而正确的方式。我想我的询问表达得很糟糕,对此感到抱歉。

最佳答案

这听起来像是您无缘无故地制造了一场维护噩梦。您的问题并没有严重到您必须发明一种基本上是新的语言功能的程度。

除此之外,如果您有一组仅在呈现信息的方式上有所不同的类型,那么您可以使用继承以外的其他机制来分解公共(public)代码。例如,您可以将委托(delegate)传递给它们的“渲染”方法,或者使用策略模式。

关于c# - "Merging"类型,不使用反射或重复代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2073082/

相关文章:

c# - 分级价格无法正常工作 (nopcommerce)

c# - 读取 XML 文件,因为它是 C# 编写的

c# - .net + 使用 redissessionstateprovider + sessionstate 自定义模式在多个服务器上共享 session

c# - 应用程序信任级别

c# - 使用 xaml 在数据网格中选择行后更改 DataGridTemplateColumn 中的复选框状态

c# - MVC4 使用 linq to sql 返回存储过程输出

c# - 获取通用枚举的描述属性

c# - 正则表达式用匹配索引替换字符

c# - 微软同步远程文件?

c# - Xamarin ScrollView 应该跳到底部