C# 我的扩展方法不起作用
我正在构建一个单位转换库,在扩展方法方面遇到了一个奇怪的问题:C# 我的扩展方法不起作用,c#,interface,extension-methods,C#,Interface,Extension Methods,我正在构建一个单位转换库,在扩展方法方面遇到了一个奇怪的问题: namespace ClassLibrary1.DistanceTypes.Imperial.Inch { public static class DistanceTypeExtension { public static Inch Inch(this DistanceType passedDistance) { return new Inch();
namespace ClassLibrary1.DistanceTypes.Imperial.Inch
{
public static class DistanceTypeExtension
{
public static Inch Inch(this DistanceType passedDistance)
{
return new Inch();
}
}
}
我正在尝试将扩展方法添加到此接口:
namespace ClassLibrary1
{
public interface DistanceType
{
double ConversionFactorToStandardUnit { get; }
}
}
在另一个类中,我有以下扩展方法:
namespace ClassLibrary1.DistanceTypes.Imperial.Inch
{
public static class DistanceTypeExtension
{
public static Inch Inch(this DistanceType passedDistance)
{
return new Inch();
}
}
}
但当我尝试使用它时:
using ClassLibrary1.DistanceTypes.Imperial;
using ClassLibrary1.DistanceTypes.Imperial.Inch;
namespace ClassLibrary1
{
[TestClass]
public class ImperialTests
{
[TestMethod]
public void ExtensionTest()
{
Distance d = new Distance(5, DistanceType.Inch());
Assert.AreEqual(5, d.ToDoubleAsInches());
}
}
}
我得到一个错误,说DistanceType不包含英寸的定义扩展方法是通过类型的实例调用的,我看到您直接在
类型
上调用它:
DistanceType distanceType = new DistanceType();
Distance d = new Distance(5, distanceType.Inch());
您还需要创建一个实现
DistanceType
的类。首先,您需要一些实现该接口的东西
public class ImplementsDistanceType : DistanceType ...
然后,您可以创建它的一个实例,并对其调用扩展方法
var d = new ImplementsDistanceType();
var i = d.Inch();
此外,您可能希望对在名称前面放置I
的接口使用标准命名约定,如
public interface IDistanceType ...
扩展方法是通过类型为
DistanceType
的实例调用的,它是一个接口,因此OP需要新建一个实现它的类。是的,这也是需要的,但当前OP调用它的方式错误,但他们仍然无法执行new DistanceType()
因为那是一个接口。@juharr同意我刚才解释了如何调用扩展方法。这个答案对Ehsan试图表达的观点提供了更多的解释。虽然接口的命名是一种观点,但我恰好同意这是一种得到强烈支持和接受的命名约定。