我想在组合框中填充项目,每个项目都有不同的行为。 是的我知道我可以简单地创建从基类派生的3个类。但我的问题是“有另一种方式”和“有可能”。 在Java中,可以执行“new MyClass(){public void overriddenmethod(){...}}”但在C#中我们不能,可以吗?
现在我使用lambda来动态定义一个方法,但问题是我后来想要新的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), }
});
答案 0 :(得分:2)
如果您只想阻止每次实例化一个新的序列化程序实例,您可以在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);
}
}