2009-03-31 6 views
0

콤보 상자에 항목을 채우고 싶습니다. 각각 다른 동작을합니다. 예 기본 클래스에서 파생 된 3 개의 클래스를 간단하게 만들 수 있음을 알고 있습니다. 그러나 제 질문은 "또 다른 방법이 있습니까"와 "가능한 것은 무엇인가"입니다. Java에서 "new MyClass() {public void overriddenmethod() {...}}"할 수 있지만 C#에서는 할 수 없습니까?C# 3.0 : 컬렉션에서 다른 동작을 가진 개체를 채우십시오.

이제는 람다를 사용하여 즉석에서 메서드를 정의하지만 나중에 해당 개체의 인스턴스 변수로 새 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

왜 형식화 프로그램을 클래스의 인스턴스 변수로 사용 하시겠습니까? 지금까지하지 않은 코드를 달성하기 위해 무엇을 시도하고 있습니까? –

+0

현재 사용자가 콤보 상자의 포맷터를 사용할 때마다 새로운 포맷터 객체가 생성되므로 피하려고합니다. 나도 알아,이 특별한 시나리오의 성능은별로 중요하지 않습니다. 추가 속성 포매터 생성을 사용하여 디시리얼라이저를 삽입하면 추가됩니다. – codymanix

답변

2

, 당신은 람다 외부 그것들을 초기화 할 수 있습니다

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