2014-08-28 1 views
2

Я создаю портативную библиотеку классов и таргетинг .Net 4.5, Windows 8, Windows Phone 8.1 и Windows Phone Silverlight 8.Могу ли я ограничить класс или метод в Portable Class Library конкретной платформой?

Могу ли я ограничить класс или метод определенной целью? Как метод можно вызывать только из проекта .Net 4.5, а не из проекта Windows Phone 8.1.

Возможно ли это?

+0

Это скорее поражает точку проекта PCL. Если вы собираетесь заставить себя создавать отдельные сборки, просто не беспокойтесь об этом. –

ответ

1

Да, используя директивы, определяющие эти платформы. Теперь я не совсем уверен, если есть директива .NET, 4.5 автоматически доступны, но, насколько я знаю, что есть в

#SILVERLIGHT, #WINDOWS_PHONE, #WP8 и #NETFX_CORE директивы доступны.

Вы можете использовать их как это:

#if WINDOWS_PHONE 
    int x = 1; 
# else 
    int x = 2; 
#endif 

В вашей ситуации вы бы разместить их по методу так что метод будет только компилируется, если правильные проекты целенаправленные.

Я считаю, что #NETFX_CORE указывает только, что это Windows 8, а не .NET. Могут быть специфические директивы .NET, но они не устанавливаются автоматически для проектов, к которым вы обращаетесь (возможно, потому, что они используют WinRT, а не .NET per sé).

Однако this answer означает, что вы можете установить его с помощью пользовательской директивы:

<DefineConstants Condition=" '$(TargetFrameworkVersion)' == 'v4.0' "> 
    RUNNING_ON_4 
</DefineConstants> 
+0

Так что я не могу просто скомпилировать библиотеку один раз, а затем использовать ее все время? Должен ли я включать исходный проект в каждый проект, с которым я хочу использовать эту библиотеку? – iboalali

+0

Нет, использование этих директив позволяет вам только скомпилировать его один раз. –

2

Это возможно с помощью Dependency Injection.

Например, вы можете использовать контекстное связывание с Ninject, чтобы ввести соответствующую реализацию типа, чтобы вызов этого метода ничего не делал, пока другая реализация должна делать то, что предназначено.

public abstract class MyBaseClass { 
    public abstract void MyMethod() { } 
} 

public class MyDerivedDotNet45Class : MyBaseclass() { 
    public override void MyMethod() { // Does something... } 
} 

public class MyDerivedWindowsPhoneClass : MyBaseClass() { 
    public override void MyMethod() { // Does nothing... } 
} 

public class MyWorkingProcessClass { 
    public MyWorkingProcessClass(MyBaseClass baseClass) { 
     dependency = baseClass; 
    } 

    public void MethodThatShallDoSomethingOnlyWhenDotNet45() { 
     dependency.MyMethod(); 
    } 

    private readonly MyBaseClass dependency; 
} 

Так что в зависимости от того, какой класс вы вводите, ваша программа должна либо что-то делать, либо ничего.

Под .Net 4,5

var workingClass = new MyWorkingProcessClass(new MyDerivedDotNet45Class()); 
wokringClass.MethodThatShallDoSomethingOnlyWhenDotNet45(); 

Это должно сделать что-то, как указано в производном классе.

Под Windows Phone

var workingClass = new MyWorkingProcessClass(new MyDerivedWindowsPhoneClass()); 
workingClass.MethodThatShallDoSomethingOnlyWhenDotNet45(); 

Это не должно делать ничего, как указано в производном классе.

Использование Ninject

This answer обеспечивает хороший пример использования Contextual Binding.

Это в Composition Root, что вы должны построить свою композицию объекта, чтобы она знала, что вводить где и когда.

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