C# 确定代码是否在Silverlight中运行的编程方法?
我有一个类需要在Silverlight和非Silverlight运行时中运行。但是,行为有点不同,所以我需要像C# 确定代码是否在Silverlight中运行的编程方法?,c#,.net,silverlight,C#,.net,Silverlight,我有一个类需要在Silverlight和非Silverlight运行时中运行。但是,行为有点不同,所以我需要像 if(isRunningInSilverlight) { // do this } else { // do that } 如何正确分配isrunningsilverlight?考虑到不同的编译器用于创建Silverlight和非Silverlight程序集,您可以使用编译器指令并有条件地编译代码,而不是在运行时检测差异。只需为SILVERLIGHT构建定义SILVERLIG
if(isRunningInSilverlight) {
// do this
} else {
// do that
}
如何正确分配
isrunningsilverlight
?考虑到不同的编译器用于创建Silverlight和非Silverlight程序集,您可以使用编译器指令并有条件地编译代码,而不是在运行时检测差异。只需为SILVERLIGHT构建定义SILVERLIGHT
(或其他定义),然后拥有:
#if SILVERLIGHT
// Do silverlight stuff
#else
// Do other stuff
#endif
此方法也可以使用。考虑到使用不同的编译器创建Silverlight和非Silverlight程序集,您可以使用编译器指令并有条件地编译代码,而不是在运行时检测差异。只需为SILVERLIGHT构建定义
SILVERLIGHT
(或其他定义),然后拥有:
#if SILVERLIGHT
// Do silverlight stuff
#else
// Do other stuff
#endif
您也可以使用此方法。是直接的,并且会起作用。但是,如果您不喜欢#如果编译器指令出现在您的代码中,您可以使用一点界面魔法来集中和抽象它
考虑以下几点:
// a nice neat public interface to centralize all of your
// run time requirements
public interface IRuntimeInfo
{
// true if silverlight runtime, false if full-Clr
bool IsSilverlight { get; }
}
使用如下的实现
public class RuntimeInfo : IRuntimeInfo
{
public bool IsSilverlight { get; private set; }
public RuntimeInfo ()
{
// @Jeff's compiler directives - er, taking his
// word 'SILVERLIGHT' is actually defined
#if SILVERLIGHT
IsSilverlight = true;
#else
IsSilverlight = false;
#endif
}
}
在你的消费者中
public class MyClass
{
private readonly IRuntimeInfo _runtimeInfo = null;
public MyClass (IRuntimeInfo runtimeInfo)
{
_runtimeInfo = runtimeInfo;
}
public void SomeMethod ()
{
if (_runtimeInfo.IsSilverlight)
{
// do your thang
}
else
{
// do some other thang
}
}
}
现在,您可以独立于实际运行时进行测试
是直接的,而且会起作用。但是,如果您不喜欢#如果编译器指令出现在您的代码中,您可以使用一点界面魔法来集中和抽象它
考虑以下几点:
// a nice neat public interface to centralize all of your
// run time requirements
public interface IRuntimeInfo
{
// true if silverlight runtime, false if full-Clr
bool IsSilverlight { get; }
}
使用如下的实现
public class RuntimeInfo : IRuntimeInfo
{
public bool IsSilverlight { get; private set; }
public RuntimeInfo ()
{
// @Jeff's compiler directives - er, taking his
// word 'SILVERLIGHT' is actually defined
#if SILVERLIGHT
IsSilverlight = true;
#else
IsSilverlight = false;
#endif
}
}
在你的消费者中
public class MyClass
{
private readonly IRuntimeInfo _runtimeInfo = null;
public MyClass (IRuntimeInfo runtimeInfo)
{
_runtimeInfo = runtimeInfo;
}
public void SomeMethod ()
{
if (_runtimeInfo.IsSilverlight)
{
// do your thang
}
else
{
// do some other thang
}
}
}
现在,您可以独立于实际运行时进行测试
建议的使用预处理器指令的解决方案肯定会起作用,但似乎更简单的解决方案是只编写一个基类,然后从中派生Silverlight和非Silverlight版本。我认为这样维护和测试会容易得多,更不用说提高代码的可读性了
看看基于运行时环境的语句是否像Javascript编程中最糟糕的东西一样打动了我,我讨厌那些与我的项目无关的代码在我不需要看到它的地方乱搞。在这条道路上存在着危险。使用预处理器指令的建议解决方案肯定会奏效,但似乎更简单的解决方案是只编写一个基类,然后从中派生Silverlight和非Silverlight版本。我认为这样维护和测试会容易得多,更不用说提高代码的可读性了
看看基于运行时环境的语句是否像Javascript编程中最糟糕的东西一样打动了我,我讨厌那些与我的项目无关的代码在我不需要看到它的地方乱搞。危险就在这条路上。这很好,但应该注意,虽然这隐藏了#if stuff(我不知道为什么你想这么做),但这将导致Silverlight部署更大的程序集,因为它们将包含两个版本的代码。而且,这意味着只能使用两种用途中都存在的类型。这是一种折衷。我回避编译器指令,因为它们很难测试[您需要所有指令的详尽交叉积来准确测试应用程序行为]。还必须考虑程序集膨胀、类型可用性等因素,但这取决于用户。这只是一个可能的解决方案:)您不需要一个详尽的叉积。您只测试有效生成的配置。测试其他任何东西都没有意义。这很好,但应该注意的是,虽然这隐藏了#if东西(我不知道你为什么想这么做),但这将导致Silverlight部署的程序集更大,因为它们将包含两个版本的代码。而且,这意味着只能使用两种用途中都存在的类型。这是一种折衷。我回避编译器指令,因为它们很难测试[您需要所有指令的详尽交叉积来准确测试应用程序行为]。还必须考虑程序集膨胀、类型可用性等因素,但这取决于用户。这只是一个可能的解决方案:)您不需要一个详尽的叉积。您只测试有效生成的配置。测试其他任何东西都没有意义。