作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试扩展泛型类型类,但我无法让 VS 查看扩展方法。
当然,有很多方法可以解决这个问题,而且它肯定不是在所有情况下都是最佳实践,但我无法弄清楚为什么在下面两个明显相同的情况下,第一个有效,而另一个无效。 t。
首先,一个成功尝试扩展 List 类的示例(只是为了证明我可以处理基础知识):
namespace Sandbox.ExtensionsThatWork
{
public static class ListExtensions
{
public static List<TheType> ExtendedMethod<TheType>(this List<TheType> original)
{
return new List<TheType>(original);
}
}
public class ExtensionClient
{
public void UseExtensionMethods()
{
List<string> a = new List<string>();
List<string> b = a.ExtendedMethod();
}
}
}
但是,我想要扩展的对象是这样的
namespace Sandbox.Factory
{
public class Factory<T>
{
public static Thing<T> Create()
{
return new Thing<T>();
}
}
public class Thing<T>{}
public static class FactoryExtensions
{
internal static Thing<FactoryType> CreateFake<FactoryType>(this Factory<FactoryType> original)
{
return new FakeThing<FactoryType>();
}
}
public class FakeThing<T> : Thing<T>{}
}
在这种情况下,我一生都无法让编译器看到扩展方法。
namespace Sandbox.FactoryClients
{
public class FactoryClient
{
public void UseExtensionMethods()
{
Factory.Thing<int> aThing = Factory.Factory<int>.Create();
///THE COMPILER WON'T FIND THE CreateFake METHOD
Factory.Thing<int> aFakeThing = Factory.Factory<int>.CreateFake<int>();
}
}
}
我错过了什么?
感谢大家抽出时间。
最佳答案
您的问题与泛型无关。
您正在调用扩展,就好像它是 Factory.Factory<int>
的静态方法一样。 ,但不可能。
C# 不支持任何类型的扩展静态方法(意味着扩展方法的行为类似于 this
参数类型的静态方法)。
您需要一个实例来调用扩展方法(就像您在“工作”示例中所做的那样):
using Sandbox.Factory;
public void UseExtensionMethods()
{
Thing<int> aThing = Factory<int>.Create();
Thing<int> aFakeThing = new Factory<int>().CreateFake();
}
关于编译器未找到泛型类型类的 C# 扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63192868/
我是一名优秀的程序员,十分优秀!