C# 确定代码是否在Silverlight中运行的编程方法?

C# 确定代码是否在Silverlight中运行的编程方法?,c#,.net,silverlight,C#,.net,Silverlight,我有一个类需要在Silverlight和非Silverlight运行时中运行。但是,行为有点不同,所以我需要像 if(isRunningInSilverlight) { // do this } else { // do that } 如何正确分配isrunningsilverlight?考虑到不同的编译器用于创建Silverlight和非Silverlight程序集,您可以使用编译器指令并有条件地编译代码,而不是在运行时检测差异。只需为SILVERLIGHT构建定义SILVERLIG

我有一个类需要在Silverlight和非Silverlight运行时中运行。但是,行为有点不同,所以我需要像

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部署的程序集更大,因为它们将包含两个版本的代码。而且,这意味着只能使用两种用途中都存在的类型。这是一种折衷。我回避编译器指令,因为它们很难测试[您需要所有指令的详尽交叉积来准确测试应用程序行为]。还必须考虑程序集膨胀、类型可用性等因素,但这取决于用户。这只是一个可能的解决方案:)您不需要一个详尽的叉积。您只测试有效生成的配置。测试其他任何东西都没有意义。