如何从Func委托返回T类型?

时间:2019-05-23 14:45:20

标签: c# .net generics func

我有一个定义如下通用Add方法的类:

public T Add(T item){

在该方法内,我想为该类型动态调用正确的方法,例如,如果我有:

private Foo AddFoo(Foo f){
    //do foo adding stuff
}

private Bar AddBar(Bar b){
    //do bar adding stuff
}

// etc,还有更多类型

如何获取我的Add方法来为我的类型调用正确的方法?似乎我可以在这里使用Func委托,但是我正在努力解决。非常感谢!

注意:不能为不同类型重载Add,因为该类从接口实现了Add方法(并且不是我要更改的接口)

2 个答案:

答案 0 :(得分:2)

为什么不重载Add方法?

public Foo Add(Foo f) { ... }
public Bar Add(Bar f) { ... }
public Baz Add(Baz f) { ... }
public Pony Add(Pony f) { ... }

编译器将自动选择正确的重载。如果将不是AddFooBarBaz的对象传递到Pony,则编译器将产生错误。如果您使用泛型并编写自己的调度,那将不是真的。

如果您使用泛型:

public T Add<T>(T obj) { ... }

然后编译器将允许您编写:

Add(new Widget());

这将导致 runtime 异常。不建议使用此解决方案。您一无所获,并且失去了类型系统的好处。

关于您的修改:

  

不能为不同类型重载Add,因为该类从接口实现了Add方法

我建议您修复此界面。此界面已损坏,应予以修复。泛型不应该用于创建仅在分派静态类型系统时执行分派的包罗万象的方法。这里对泛型的使用与简单地使用object作为返回和参数类型没有什么不同。

如果无法修复此界面,请选择其他答案。

答案 1 :(得分:-1)

在C#7.1或更高版本中,您可以通过以下方式进行模式匹配:

public T Add<T>(T item)
{
    switch (item)
    {
        case Foo a: return (T)(object) AddFoo(a);
        case Bar b: return (T)(object) AddBar(b);
        default: throw new InvalidOperationException(typeof(T) + " is not supported!");
    }
}