2015-04-16 3 views
1

Я строю библиотеки Unit Conversion и у меня возникают странные проблемы с метода расширения:Мой метод расширения не работает

Я пытаю добавить метод расширения для этого интерфейса:

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 определения для Inch

+5

метод расширения вызывается с помощью экземпляра типа –

ответ

2

метод расширения вызывается через экземпляр типа, что я вижу, что вы вызываете его на Type непосредственно:

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

и вы также необходимо создать класс, который реализует DistanceType

+0

'DistanceType' является интерфейсом, так что ОП должен новый класс, который реализует его. – 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

Этот ответ дает немного больше объяснений тому, что пытался Эхсан сделать. И хотя точка на наименовании интерфейса - это мнение, это строго поддерживаемое и принятое соглашение об именах, с которым я согласен. – Daved

Смежные вопросы