C#3.0:填充集合中具有不同行为的对象

C#3.0:填充集合中具有不同行为的对象,c#,collections,c#-3.0,lambda,C#,Collections,C# 3.0,Lambda,我想在组合框中填充项目,每个项目都有不同的行为。 是的,我知道我可以简单地创建3个从基类派生的类。但我的问题是“还有别的办法吗”和“什么是可能的”。 在Java中可以执行“newMyClass(){public void overridedMethod(){…}}”,但在C#中我们不能,对吗 现在我使用lambda动态地定义一个方法,但问题是我以后希望新的XxxFormatter()作为该对象的实例变量。因为XxxFormatters不共享公共基类,所以我不能将它们作为SerializengHe

我想在组合框中填充项目,每个项目都有不同的行为。 是的,我知道我可以简单地创建3个从基类派生的类。但我的问题是“还有别的办法吗”和“什么是可能的”。 在Java中可以执行“newMyClass(){public void overridedMethod(){…}}”,但在C#中我们不能,对吗

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

你有什么想法吗

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), }

});

如果您只是想防止每次实例化新的序列化程序实例,可以在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);
    }
}
委托无效序列化处理程序(TFormatter格式化程序,
溪流,
对象图);
接口ISerializingHelper
{
void序列化(流、对象图);
}
类SerializengHelper:ISerializengHelper
{
私有只读序列化处理程序;
专用只读TFormatter格式化程序;
公共SerializingHelper(SerializingHandler处理程序,
TFormatter(格式化程序)
{
this.handler=handler;
this.formatter=格式化程序;
}
公共TFormatter格式化程序
{
获取{返回this.formatter;}
}
公共void序列化(流、对象图)
{
this.handler(this.formatter、stream、graph);
}
}

为什么希望格式化程序作为类的实例变量?您试图实现的目标是什么,而您给出的代码还没有实现?目前,每次用户使用组合框中的格式化程序时,都会创建一个新的格式化程序对象,这是我想要避免的。我知道,在这种特殊情况下,性能并不重要。另外,如果使用其他属性插入反序列化程序,则会重复创建格式化程序。