【问题标题】:C# 3.0: Fill in objects with different behaviour in collectionsC# 3.0:在集合中填充具有不同行为的对象
【发布时间】:2009-03-31 17:27:57
【问题描述】:

我想在组合框中填充项目,每个项目都有不同的行为。 是的,我知道我可以简单地创建 3 个派生自基类的类。但我的问题是“还有其他方法吗”和“有什么可能”。 在 Java 中可以执行“new MyClass(){public void overriddenmethod(){...} }”,但在 C# 中我们不能,不是吗?

现在我使用 lambda 动态定义一个方法,但问题是我稍后希望 new XxxFormatter() 作为该对象的实例变量。由于 XxxFormatters 不共享公共基类,我不能将它们作为单个字段放在 SerializingHelper 类中。

你有什么想法吗?

public delegate void SerializingHandler(Stream s, object o);

class SerializingHelper
{
    public string Name { get; set; }
    public SerializingHandler Serializer { get; set; }
}

comboFormat.Items.AddRange(new object[] 
{ 
            new SerializingHelper{ Name = "Binary", 
Serializer = (s,o)=>new BinaryFormatter().Serialize(s,o),

            new SerializingHelper{ Name = "Soap", 
Serializer = (s,o)=>new SoapFormatter().Serialize(s,o), 

            new SerializingHelper{ Name = "Xml", 
Serializer = (s,o)=>new XmlSerializer(typeof(KontaktpartnerData), new Type[]   
 {typeof(ArrayList), typeof(KontaktPartner)}).Serialize(s,o), }

});

【问题讨论】:

  • 为什么要将格式化程序作为类的实例变量?您想实现您提供的代码尚未实现的目标是什么?
  • 目前,每次用户使用组合框中的格式化程序时,都会创建一个新的格式化程序对象,我想避免这种情况。我知道,在这种特殊情况下的性能并不重要。此外,如果我使用额外的属性格式化程序插入反序列化程序,则会重复创建。

标签: c# collections c#-3.0 lambda


【解决方案1】:

如果你只是想防止每次都实例化一个新的序列化器实例,你可以在 lambda 之外实例化它们:

var binaryFormatter = new BinaryFormatter();

comboFormat.Items.AddRange(new object[]
{ 
    new SerializingHelper
    {
        Name = "Binary",
        Serializer = binaryFormatter.Serialize
    }

    ...
});

如果您确实需要将格式化程序存储为字段,则可以执行以下操作:

delegate void SerializingHandler<TFormatter>(TFormatter formatter,
                                             Stream stream,
                                             object graph);

interface ISerializingHelper
{
    void Serialize(Stream stream, object graph);
}

class SerializingHelper<TFormatter> : ISerializingHelper
{
    private readonly SerializingHandler<TFormatter> handler;
    private readonly TFormatter formatter;

    public SerializingHelper(SerializingHandler<TFormatter> handler,
                             TFormatter formatter)
    {
        this.handler = handler;
        this.formatter = formatter;
    }

    public TFormatter Formatter
    {
        get { return this.formatter; }
    }

    public void Serialize(Stream stream, object graph)
    {
        this.handler(this.formatter, stream, graph);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-02-18
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    • 2011-09-30
    相关资源
    最近更新 更多