2015-09-21 31 views
5

我有這兩個接口實現通用的界面,需要一個通用的接口作爲參數

/// <summary> 
///  Represents an interface that knows how one type can be transformed into another type. 
/// </summary> 
/// <typeparam name="TInput"></typeparam> 
/// <typeparam name="TOutput"></typeparam> 
public interface ITransformer<in TInput,out TOutput> 
{ 
    TOutput Transform(TInput input); 
} 

public interface ITransform 
{ 
    TOutput Transform<TInput,TOutput>(ITransformer<TInput, TOutput> transformer); 
} 

我有一個類中,在希望實現ITranform這樣。

public class MessageLogs :ITransform 
{ 
    // But I am am not able to implement the ITransform interface like this 
    // MessageLogs is getting binded in the param but not getting binded to 
    // TInput in the Transform<TIn,TOut> 
    // 
    public T Transform<MessageLogs, T>(ITransformer<MessageLogs, T> transformer) 
    { 
     return transformer.Transform(this); 
    } 

} 

如何正確地做到這一點不失這種通用的兩個接口? 我有很多變形金剛。

回答

2

接口要求實現的方法在TInput和TOutput中都是通用的。換句話說,MessageLogs也必須能夠接受TInput的其他類型。這不是你想要的。你會需要這樣的東西:

public interface ITransformer<in TInput,out TOutput> 
{ 
    TOutput Transform(TInput input); 
} 

public interface ITransform<TInput> 
{ 
    TOutput Transform<TOutput>(ITransformer<TInput, TOutput> transformer); 
} 

public class MessageLogs : ITransform<MessageLogs> 
{ 
    public TOutput Transform<TOutput>(ITransformer<MessageLogs, TOutput> transformer) 
    { 
     return transformer.Transform(this); 
    } 
} 
+0

我希望我能做到這一點。 ITransform未執行 – Sameer

+0

謝謝!現在工作。 – Sameer

1

更改界面進入泛型接口的方法,而不是在它

像下面

public interface ITransformer<in TInput, out TOutput> 
    { 
     TOutput Transform(TInput input); 
    } 

    public interface ITransform<TInput, TOutput> 
    { 
     TOutput Transform(ITransformer<TInput, TOutput> transformer); 
    } 
    public class MessageLogs<T> : ITransform<MessageLogs<T>,T> 
    { 

     public T Transform(ITransformer<MessageLogs<T>, T> transformer) 
     { 
      return transformer.Transform(this); 
     } 

    } 

更新代碼 讓說你不希望MessageLog知道它轉換成什麼。然後在下面做。

public class Transformer<T1,T2> : ITransform<T1,T2> 
    { 

     public T2 Transform(T1 logger,ITransformer<T1, T2> transformer) 
     { 
      return transformer.Transform(logger); 
     } 

    } 
    public class MessageLogs 
    { 
     // code specific to message logging 
    }