我有一个通用的委托,如下所示:
我有一个通用类,它将委托作为参数传递给构造函数,如下所示:
这不起作用是因为DefaultStringHandler返回了一个字符串,而该方法期望返回T类型的值。
我唯一发现的解决办法是创建一个特定类型的子类SomeClass,重载默认构造函数:
如果通用类型能够具有类型特定的重载构造函数,并在实例化特定类型的类时使用,那将会很有趣。
public delegate T SomeHandler<T>(T input);
我有一个通用类,它将委托作为参数传递给构造函数,如下所示:
public class SomeClass<T>
{
private SomeHandler<T> m_handler;
public SomeClass(SomeHandler<T> handler)
{
m_handler = handler;
}
public void DoSomeStuff(T input)
{
T result = m_handler(input);
// some stuff
}
}
大多数情况下,我会使用默认处理程序来实例化类,除非需要一些特殊情况。因此,我为我使用的类型准备了一些默认处理程序:
public static class DefaultHandlers
{
public static string DefaultStringHandler(string input)
{
return input;
}
}
在某些情况下,该类型会实例化一个特殊处理程序,该处理程序专门针对其实现进行。
public class Example
{
private SomeClass<string> m_typicalCase;
private SomeClass<string> m_specialCase;
public Example()
{
m_typicalCase = new SomeClass<string>(DefaultHandlers.DefaultStringHandler);
m_specialCase = new SomeClass<string>(SpecialHandler);
}
private string SpecialHandler(string input)
{
string result;
// Do something special
return result;
}
}
我想为 SomeClass 创建一个默认构造函数,该函数始终使用相同的默认处理程序实例化该类,但由于类型在编译时未知,因此无法返回正确类型的委托。
public class SomeClass<T>
{
...
public SomeClass()
{
m_handler = DefaultHandlers.GetDefaultHandler<T>();
}
...
}
像这样
public static class DefaultHandlers
{
public static SomeHandler<T> GetDefaultHandler<T>()
{
if (typeof(T) == typeof(string))
{
return DefaultStringHandler;
}
}
}
这不起作用是因为DefaultStringHandler返回了一个字符串,而该方法期望返回T类型的值。
我唯一发现的解决办法是创建一个特定类型的子类SomeClass,重载默认构造函数:
public class SomeStringClass : SomeClass<string>
{
public SomeStringClass()
: base(DefaultHandlers.DefaultStringHandler)
{
}
public SomeStringClass(SomeHandler<string> handler)
: base(handler)
{
}
}
如果通用类型能够具有类型特定的重载构造函数,并在实例化特定类型的类时使用,那将会很有趣。
public class Foo<T>
{
public Foo<string>(string input)
{
}
public Foo<int>(int input)
{
}
public Foo(T input)
{
}
}
也许有一种更优雅的方式来处理这个问题,使用设计模式,比如策略模式?
(SomeHandler<T>)DefaultStringHandler
应该可以工作...(正如Jon Skeet所指出的那样,如果它总是标识,你可以使用lambda进行内联,例如:x => x
) - Alexei Levenkov