C#:通用方法不调用特定方法重载
我试图在C#中创建一个generics方法,它将根据其主体中的参数数据类型调用不同的方法,然后处理它们的结果。 我试图通过创建一个通用的包装器方法来实现这一点,然后提供处理方法的几个重载 – 包括一个通用的,如果没有特定的重载可用。
当我直接调用处理方法时,正确选择了适当的版本。 但是当我从包装器方法调用它时,它总是选择generics方法,即使我传递给它的特定数据类型存在匹配的重载。
有没有办法调整代码使其行为符合我的需要? 或者我必须使用不同的方法。
我需要代码与Mono 2.6兼容。
using System; class Program { static void Func(T val) { Console.WriteLine("Generic Func"); } static void Func(int val) { Console.WriteLine("Int Func"); } static void Func(string val) { Console.WriteLine("String Func"); } static void FuncWrap(T val) { Console.Write("Wrap: "); Func(val); } static void Main(string[] args) { Func(2); Func("Potato"); Func(2.0); FuncWrap(2); FuncWrap("Potato"); FuncWrap(2.0); Console.Read(); } }
有没有办法纠正这种行为?
根据C#语言规范,它已经是正确的行为。 在FuncWrap
调用的Func
的重载通常在编译时确定,因此它不能基于执行时类型选择不同的Func
重载。
但是,改变行为的一种方法是使用动态类型:
static void FuncWrap(T val) { Console.Write("Wrap: "); dynamic x = val; Func(x); }
现在,它将根据x
值的实际类型在执行时执行重载x
。 这会产生性能成本,但应该按照您的意愿行事。
或者,您可以硬编码重载的知识:
static void FuncWrap(T val) { Console.Write("Wrap: "); if (typeof(T) == typeof(string)) { Func((string)(object)val); } else if (typeof(T) == typeof(int)) { Func((int)(object)val); } else { Func(val); } }
但这显然非常可怕。
- 在c#asp.net中登录后禁用Web浏览器后退按钮
- Dapper with Attributes mapping
- 将WPF文本框设为剪切,复制和粘贴限制
- 在C#中使用图像制作video的工作方式
- 在机器上获取所有IP地址
- 将Membership.GetAllUsers()强制转换为通用列表时出现NotSupportedException
- Autofac – 无法创建请求生命周期范围,因为HttpContext不可用 – 由于异步代码?
- .NET RegEx用于validation6到20个字符之间的密码,至少包含一个大写字母,一个小写字母和一个数字
- 如何将Webcredentials从活动用户传递到Windows服务?