【发布时间】:2016-07-28 15:50:29
【问题描述】:
我的代码中有一个针对 .NET Core 和 net45 的库,我需要像这样使用反射:
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.IsPrimitive 和 types.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