小编Raf*_*afe的帖子

在编译之前检测是否定义了类/类型

这类似于我找到的其他一些线程,但我还没有找到我需要的答案。我希望得到一个直接的回答,即使是“不,你不能那样做”。

有没有一种方法可以在类/类型存在时使用一个代码块,如果不存在则使用另一个代码块。结果将与使用预处理器指令相同,但无需 #define 和手动注释或取消注释文件中的某些内容。

这可能是一个特殊的用例。我不知道。我在一个环境中工作,在编译任何东西之前,可以安装或不安装文件集。所以有人可以购买一个“安装”的插件(添加到项目中的文件),这使得类/类型可供使用(如扩展 API)。如果有人没有我们的其他插件包之一,我需要提供一种解决方法。我希望这是有道理的。

除非我们必须这样做,否则要求某人打开我们的一个文件(如果他们有另一个插件)取消对预处理器指令的注释对用户来说是不友好的。

例如,我知道这不起作用,因为它只在使用 #define 时测试布尔值,但它说明了我正在尝试做什么......

#if SomeType
    SomeType.DoSomething();
#else
    DefaultWay.DoSomething();
Run Code Online (Sandbox Code Playgroud)

编辑:我将此添加为 C# 功能建议。请在这里投票:http : //visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2297494-add-type-testing-as-preprocessor-directive

我不知道反射是如何做到这一点的,但我是 C# 的新手,所以如果可能的话,使用重选的例子会很棒。

c# types c-preprocessor

7
推荐指数
1
解决办法
1581
查看次数

通用T与枚举和铸造T到枚举

我四处搜索,找不到任何这样做的例子,虽然这很有帮助:

创建将T限制为枚举的通用方法

我有一个泛型函数,它将函数包装在API中(我无法触及).包装函数采用System.Enum并返回相同的函数.我的通用版本在本示例的非剥离版本中简化了相当多的内容.

问题是,我无法从T到System.Enum,或者再次回到原因,因为T不限于System.Enum(至少这是我的理解).

以下代码有效,但我很想知道是否有任何隐藏的陷阱或更好的方法,因为我对泛型非常新:

using System
using System.Collections.Generic
...

    public T EnumWrapper<T>(T enumVar) where T : struct, IFormattable, IConvertible, IComparable
    {
        if (!typeof(T).IsEnum)
            throw new ArgumentException("Generic Type must be a System.Enum")

        // Use string parsing to get to an Enum and back out again
        Enum e = (Enum)Enum.Parse(typeof(T), enumVar.ToString());
        e = WrappedFunction(e);
        return (T)Enum.Parse(typeof(T), e.ToString());
    }
Run Code Online (Sandbox Code Playgroud)

如果这样可以,那就以此为例.我找不到这个,至少它是一个可行的解决方案.

在这种情况下,PS性能不是问题.我以为我认为字符串工作可能很慢而且我总是对性能提示感兴趣.

.net generics enums casting constraints

5
推荐指数
1
解决办法
4942
查看次数

标签 统计

.net ×1

c# ×1

c-preprocessor ×1

casting ×1

constraints ×1

enums ×1

generics ×1

types ×1