首页 > 解决方案 > 如何通过泛型方法调用数据成员的方法

问题描述

考虑到以下课程,我希望能够编写:

B b = new B();
b.f(1); // calls b._a.f(int)
b.f("howdy!"); // calls b._a.f(string)

A类不能修改。

public class A
{
    public void f(int i) { }
    public void f(string s) { }
}

public class B
{
    public void f<T>(T v)
    {
        _a.f(v); // fails
    }

    A _a = new A();
}

标签: c#

解决方案


如果您真的想将f传递简化为单个方法,则必须使用运行时类型检查。我没有看到任何其他方式。泛型在这里不起作用。

public void f(object v) 
{
    if (v is int i)
        _a.f(i);
    else if (v is string s)
        _a.f(s);
    else
        throw new InvalidOperationException();
}

我知道您不愿公开_a,因为上面有一些方法您不希望调用者可以访问?您能否介绍一个接口,或者将其视为对 class 的修改A

public interface IFoo
{
    void f(int i);
    void f(string s);
}

public class A : IFoo
{
    ...  
}

public class B
{
    public IFoo A => _a;
}

推荐阅读