C# 从泛型函数内部调用正确的重载
我有以下代码,其中我试图从泛型函数内部访问右重载函数:C# 从泛型函数内部调用正确的重载,c#,generics,overloading,C#,Generics,Overloading,我有以下代码,其中我试图从泛型函数内部访问右重载函数: using System; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; namespace Rextester { class A { public void a(int a) { Console.WriteLine("a: int"); } publi
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
namespace Rextester
{
class A
{
public void a(int a) { Console.WriteLine("a: int"); }
public void a(string a) { Console.WriteLine("a: string"); }
public void a(int a, int b) { Console.WriteLine("a: int int"); }
public void a(string a, string b) { Console.WriteLine("a: string string"); }
public void a(params object[] args) { Console.WriteLine("a: object"); }
}
class B
{
A a;
public B(A _a) { this.a = _a; }
public void b1<T>(T t) { a.a(t); }
public void b2<T1, T2>(T1 t1, T2 t2) { a.a(t1, t2); }
public void b(int i) { Console.WriteLine("b: int "); b1(i); }
public void b(string i) { Console.WriteLine("b: string"); b1(i); }
public void b(int i, int b) { Console.WriteLine("b : int int"); b2(i,b);}
public void b(string i, string b) { Console.WriteLine("b: string string"); b2(i,b); }
}
public class Program
{
public static void Main(string[] args)
{
//Your code goes here
Console.WriteLine("Hello, world!");
B b = new B(new A());
b.b(1);
b.b("1");
b.b(1,2);
b.b("1", "2");
}
}
}
预期产出:
Hello, world!
b: int
a: int
b: string
a: string
b : int int
a: int int
b: string string
a: string string
如果参数不匹配,则应调用(params object[]args)
对于实际使用,A
是,而A
是WriteEvent
。
B
是一个具有许多(~1000)B
s个复杂参数顺序的代码库。
我可以更改b1
和b2
<代码>bn(n~10)以便使工作更容易
a
的参数仅为本机类型,如int、string、long
或Guid
我能做些什么来实现它?
基本上,泛型方法调用的重载解析仍然发生在编译时,因此,除非存在泛型类型约束,否则泛型类型对于函数中的大多数内容都被视为
对象
如果需要不同的行为,则需要运行时重载解决方案。归档的一种方法是对应该使用一些重载的方法调用使用dynamic
类型:
public void b1<T>(T t) { a.a((dynamic)t); }
public void b2<T1, T2>(T1 t1, T2 t2) { a.a((dynamic)t1, (dynamic)t2); }
publicvidb1(T){a.a((动态)T);}
公共空间b2(T1,t2t2){a.a((动态)T1,(动态)T2);}
但是,这将基本上忽略泛型类型:
假设你写信
public void b(int i) { Console.WriteLine("b: int "); b1<object>(i); }
publicsvoidb(inti){Console.WriteLine(“b:int”);b1(i)}
然后动态将忽略您明确指定的对象
类型,仍然调用a.a的int
重载
另一种方法是反射,检查泛型类型并尝试调用匹配的方法重载。在我的代码库中<代码>B继承A
。。但是这会让生活更简单吗?a.a(t)
只能解析为a(params object[]args)
,因为它是唯一与t
调用匹配的签名。重载解析不是对泛型方法的每次可能调用都“重做”——泛型不是模板。有没有其他方法可以(轻松地)做到这一点代码>采用int a
变量还是a
变量?若它总是接受A
的对象,那个么您必须总是调用default方法。如果将int a
重命名为int i
,会发生什么情况?@AshishNegi:根据该名称提取接口和程序,和/或使用dynamic
、代理(Castle DynamicProxy等)、代码重写(PostSharp等)、T4模板生成,或者只需滚动您自己的代码,通过反射您想要拦截/包装的方法来一次性生成代码。这一切都不是那么容易,但肯定会战胜体力劳动。
public void b(int i) { Console.WriteLine("b: int "); b1<object>(i); }