Jad*_*ias 2 .net c# generics reflection overloading
如果我们在传递给下面的重载方法之前将它转换为"Object",则Int32类型的变量将不会作为Int32进行线程化:
public static void MethodName(int a)
{
Console.WriteLine("int");
}
public static void MethodName(object a)
{
Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)
要将它作为Int32处理,即使它被强制转换为"Object"也可以通过反射来实现:
public static void MethodName(object a)
{
if(a.GetType() == typeof(int))
{
Console.WriteLine("int");
}
else
{
Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud)
还有另一种方法吗?也许使用泛型?
Dan*_*ker 10
在C#4.0之前,运行时重载解析将不可用,它具有dynamic
:
public class Bar
{
public void Foo(int x)
{
Console.WriteLine("int");
}
public void Foo(string x)
{
Console.WriteLine("string");
}
public void Foo(object x)
{
Console.WriteLine("dunno");
}
public void DynamicFoo(object x)
{
((dynamic)this).Foo(x);
}
}
object a = 5;
object b = "hi";
object c = 2.1;
Bar bar = new Bar();
bar.DynamicFoo(a);
bar.DynamicFoo(b);
bar.DynamicFoo(c);
Run Code Online (Sandbox Code Playgroud)
转换this
为dynamic
启用动态重载支持,因此DynamicFoo
包装器方法能够Foo
根据参数的运行时类型调用最佳拟合重载.
public static void MethodName(object a)
{
if(a is int)
{
Console.WriteLine("int");
}
else
{
Console.WriteLine("object");
}
}
Run Code Online (Sandbox Code Playgroud)