2015-09-21 10 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 
    } 
Смежные вопросы