【发布时间】:2017-07-12 11:30:25
【问题描述】:
我有以下代码,我试图从泛型函数内部访问正确的重载函数:
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: object
b: string
a: object
b : int int
a: object
b: string string
a: object
预期输出:
Hello, world!
b: int
a: int
b: string
a: string
b : int int
a: int int
b: string string
a: string string
如果参数不匹配 public void a(params object[] args) 应该被调用。
对于实际使用,A 是 EventSource,a 是 WriteEvent。
B 是一个代码库,包含许多 (~1000) bs 和复杂的参数顺序。
我可以更改b1 和b2 .. bn (n ~ 10) 以便于工作。
a 的参数只是像 int, string, long 或 Guid 这样的原生类型。
我能做些什么来实现它? 我愿意接受任何其他实现解决方案的好方法。
【问题讨论】:
-
在我的代码库中 ..
B inherits A.. 但这会让生活更轻松吗? -
a.a(t)只能解析为a(params object[] args),因为它是唯一匹配T调用的签名。对于泛型方法的每个可能调用,重载解决方案都不会“重做”——泛型不是模板。 -
有没有其他方法可以(轻松)做到这一点?
-
一个QQ,
b1(a);取int a变量还是A a变量?如果它总是采用A的对象,那么您必须始终调用默认方法。如果您将int a重命名为int i,会发生什么情况? -
@AshishNegi:提取一个接口和程序,和/或使用
dynamic、代理(Castle DynamicProxy 等)、代码重写(PostSharp 等)、T4 模板生成,或者只是通过反映您想要拦截/包装的方法,滚动您自己的代码以进行一次性代码生成。这一切都不是很容易,但肯定会胜过体力劳动。
标签: c# generics overloading