[英]Implementing Interface to a Generic method parameter VS Implementing Interface to an method argument
[英]Implementing generic interface that takes a generic interface as a parameter
我有这两个接口
/// <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);
}
}
如何正确地做到这一点而不会失去两个接口的通用性? 我有很多变形金刚。
该接口要求实现的方法在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);
}
}
将您的界面更改为泛型界面而不是其中的方法
如下
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
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.