2015-04-16 102 views
1

我建立一个单位转换库,并因与扩展方法一个奇怪的问题:我的扩展方法不起作用

我试图扩展方法添加到该接口:

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不contatin定义为英寸

+5

扩展方法通过类型 –

回答

2

扩展方法是通过类型的实例调用,我看到你在Type调用它直接:

DistanceType distanceType = new DistanceType(); 
Distance d = new Distance(5, distanceType.Inch()); 

和你还需要创建一个类实现DistanceType

+0

的实例调用'DistanceType'是一个接口,因此OP需要新的实现它的类。 – juharr

+0

是的,这也是需要的,但是目前OP正在调用它错误的方式 –

+0

但是他们仍然不能'new DistanceType()',因为那是一个接口。 – juharr

1

首先你需要一些实现该接口的东西。

public class ImplementsDistanceType : DistanceType ... 

然后你可以创建一个实例并调用它的扩展方法。你

var d = new ImplementsDistanceType(); 
var i = d.Inch(); 

可能还需要使用接口标准的命名约定,如名称前放一个I

public interface IDistanceType ... 
+0

这个答案提供了一些Ehsan试图提出的更多解释。虽然界面命名的观点是一个观点,但它是一个强烈支持和接受的命名约定,我恰好同意这一点。 – Daved