【问题标题】:How to pick the correct c# overloaded extension method called from a generic method如何选择从泛型方法调用的正确 c# 重载扩展方法
【发布时间】:2017-01-18 14:12:25
【问题描述】:

我正在努力获取在泛型方法中调用的正确扩展方法。

我猜这是编译时方法选择的限制,但在 C# 中有没有巧妙的解决方法?

[TestClass]
public class WrongOverloadSelection 
{
    [TestMethod]
    public void WorksNew()
    {
        new Generic<A>().Test();
    }

    [TestMethod]
    public void FailsGeneric()
    {
        PicksWrongOverload<A>();
    }

    public void PicksWrongOverload<T>()
    {
        new Generic<T>().Test();
    }
}

public class A{}
public class Generic<T>{}

public static class Extensions
{
    public static void Test(this Generic<A> source) { }

    public static void Test<T>(this Generic<T> source) 
    {
        throw new Exception("Not this one!");
    }
}

【问题讨论】:

  • 在某些情况下添加类型约束是一种选择
  • 这不会很遗憾,我只是尝试查看甚至 PicksWrongOverload() 在 T:A 失败的地方,我想我可能不得不做一些 MethodInfo 反射,这很可惜,因为我想在与“重载”不同的类中提供通用实现
  • @Lee 如果我没记错的话,dynamic 不支持扩展方法
  • 问题是 PicksWrongOverload&lt;T&gt; 内部的调用在编译时被评估并生成了方法代码。 T不继承自Generic&lt;A&gt;,所以编译器必须选择另一个overload

标签: c# generics methods


【解决方案1】:

试试这个:

// Now it picks then right one
public static void PicksWrongOverload<T>()
{
    Extensions.Test((dynamic)new Generic<T>());
}

原因在here 进行了解释,但基本上在运行时,CLR 会将动态类型转换为例程所需的类型,如果没有发生任何违反类型检查规则的事情,那么您就可以开始了.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    相关资源
    最近更新 更多