【问题标题】:Compiler directives for targeting several frameworks using .NET Core使用 .NET Core 针对多个框架的编译器指令
【发布时间】:2016-07-28 15:50:29
【问题描述】:

我的代码中有一个针对 .NET Corenet45 的库,我需要像这样使用反射:

var type = obj.GetType();
var properties = type.GetProperties().ToList();

if (type.IsPrimitive || type.IsEnum || properties.Count == 0)
    return new Dictionary<string, object> { { unnamed, obj } };

现在我正在移植我的库以支持.net core,所以我创建了一个新的.net core library 项目,这是我的project.json

{
  "version": "1.0.0",
  "dependencies": {
    "Wen.Logging.Abstractions": "1.0.0"
  },
  "frameworks": {
    "net45": {
      "frameworkAssemblies": {
        "System.Reflection": "4.0.0.0"
      },
      "dependencies": {
        "Newtonsoft.Json": "6.0.4",
        "NLog": "4.3.5"
      }
    },
    "netstandard1.6": {
      "imports": "dnxcore50",
      "dependencies": {
        "NETStandard.Library": "1.6.0",
        "System.Reflection.TypeExtensions": "4.1.0",
        "Newtonsoft.Json": "8.0.2",
        "NLog": "4.4.0-*"
      }
    }
  }
}

添加了我的类,编译器抱怨 type.IsPrimitivetypes.IsEnum 属性,所以我想使用编译器指令来做这样的事情:

var type = obj.GetType();
var properties = type.GetProperties().ToList();

#if net45    

if (type.IsPrimitive || type.IsEnum || properties.Count == 0)
    return new Dictionary<string, object> { { unnamed, obj } };

#elif netstandard16

//... some code

#endif

一旦我这样做了,net45 中的代码就会变灰(我认为是因为 VS 将其视为.net core),但是无论我在#elif#endif 之间设置什么标签也都是灰色的.我也尝试过#else,然后我可以这样做:

var typeInfo = type.GetTypeInfo();
if(typeInfo.IsPrimitive || typeInfo.IsEnum || properties.Count == 0)
    return new Dictionary<string, object> { { unnamed, obj } };

但是我的问题仍然存在:

我应该在编译器指令#if 上的代码上使用哪些标签,以针对同一项目/库中的多个框架?

【问题讨论】:

  • @JonSkeet 该帖子是一年前创建的,因此这种尝试是可以接受的。我同意今天没有人应该再走那条路了。
  • @LexLi:好点——我只看到它是因为它是在 3 小时前编辑的。将删除我的评论...

标签: c# reflection .net-core


【解决方案1】:

在对.net core 进行一些研究时,我遇到了this question,在接受的答案中,project.json 文件代码中有一些东西引起了我的注意,这是一个 sn-p:

"frameworks": {
"net46": {
  "buildOptions": {
    "define": [ "NET46" ]
  }
},

正如您在buildOptions 中看到的那样,有一个define: [ NET46 ],这是您可以在#if#elif 指令中使用的标签。因此,即使我不知道(或没有)引用这些框架版本的方法,我也可以使用自己的。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
  • 2018-05-17
  • 1970-01-01
  • 2016-12-07
  • 1970-01-01
  • 1970-01-01
  • 2011-07-23
相关资源
最近更新 更多