小编Ath*_*ari的帖子

强制JsonConvert.SerializeXmlNode将节点值序列化为整数或布尔值

类中的SerializeXmlNode函数Newtonsoft.Json.JsonConvert总是在序列化过程中将XML的最后一个子节点的值作为字符串类型输出,有时您可能需要将它们序列化为整数或布尔值.

示例代码:

<Object>
  <ID>12</ID>
  <Title>mytitle</Title>
  <Visible>false</Visible>
</Object>
Run Code Online (Sandbox Code Playgroud)

输出:

{ "ID" : "12",
  "Title" : "mytitle",
  "Visible" : "false"
}
Run Code Online (Sandbox Code Playgroud)

期望的输出:

{ "ID" : 12,
  "Title" : "mytitle",
  "Visible" : false
}
Run Code Online (Sandbox Code Playgroud)

有没有办法强制XML节点序列化为整数或布尔值?

谢谢.

注意:当XML已经序列化为JSON字符串时,请避免发布变通办法,因为这些变通办法是我们愿意避免的.

c# json json.net

8
推荐指数
2
解决办法
9253
查看次数

MethodImplAttribute(InternalCall,Runtime)对COM Interop接口的方法做了什么?

Windows API Code Pack for .NET Framework中,COM Interop接口的许多方法都使用MethodImplAttribute例如:

internal interface IShellItem
{
    [PreserveSig]
    [MethodImpl(
        MethodImplOptions.InternalCall,
        MethodCodeType = MethodCodeType.Runtime)]
    HResult BindToHandler(
        [In] IntPtr pbc, [In] ref Guid bhid, [In] ref Guid riid,
        [Out, MarshalAs(UnmanagedType.Interface)] out IShellFolder ppv);
Run Code Online (Sandbox Code Playgroud)

MethodImplOptions.InternalCall价值文件说:

调用是内部的,也就是说,它调用在公共语言运行库中实现的方法.

文档MethodCodeType.Runtime说:

指定方法实现由运行时提供.

但是,如果我理解正确,这两种说法都是正确的.据MSDN称,它IShellItem是在shell32.dll中实现的.shell32.dll不是CLR的一部分.有趣的是,并非所有方法都有MethodImplAttribute.IShellFolder是,IShellLinkW不,IShellLibrary做,IPersistStream不等.

为什么MethodImplAttribute应用于某些COM Interop接口?在这种情况下它意味着什么?它如何修改互操作的行为?

.net c# com com-interop

8
推荐指数
1
解决办法
2632
查看次数

如何避免从F#库返回Task <Microsoft.FSharp.Core.Unit>

当使用Async.StartAsTask在F#中包装异步操作时,返回的类型将是Task<unit>.这使得接口的用户依赖于F#核心库.是否有建议的做法来避免这种情况,或者通常是否接受将其置于默认状态?

.net c# clr f# interop

8
推荐指数
1
解决办法
199
查看次数

ConfigurationManager.AppSettings在.Net Standard 1.5上生成编译时错误

我正在使用.Net Standard 1.5并希望从我的配置中读取一些值.但是以下行

ConfigurationManager.AppSettings["Foo"]
Run Code Online (Sandbox Code Playgroud)

给我以下编译时错误:

CS7069引用类型'NameValueCollection'声称它在'System'中定义,但找不到它

我想也许在.Net Standard中有另一种方法可以从AppSettings中读取,但我还没有找到关于该主题的任何内容.

configurationmanager appsettings namevaluecollection .net-standard .net-standard-1.5

8
推荐指数
0
解决办法
1231
查看次数

使用.NETStandard时,不会将Nuget包复制到输出

我想在WPF(.NET 4.6)应用程序和.NET Core应用程序之间共享项目.为此,我通过最初创建一个可移植的库并在Visual Studio 2015中将其转换为.NETStandard 1.3版来创建.NET标准库.

但是,.NETStandard库需要引用Entity Framework(例如),所以我在project.json中添加了这个依赖项,所有内容都很愉快.但是,当我实际运行应用程序时,只要实际尝试使用Entity Framework库加载数据,我就会收到File Not Found异常.这是预期的,因为使用.NETStandard时没有任何nuget包被复制到输出目录(不像使用nuget用于普通的.NET),所以我可以看到异常的原因.

当使用.NETStandard库并从.NET 4.6项目引用时,如何解决此问题/获取要复制到输出的nuget依赖项?(下面是我的project.json,并且很乐意在需要时添加更多代码).

{
  "supports": {},
  "dependencies": {
    "Microsoft.EntityFrameworkCore.Design": "1.1.0",
    "Microsoft.EntityFrameworkCore.Sqlite": "1.1.0",
    "Microsoft.NETCore.Portable.Compatibility": "1.0.1",
    "NETStandard.Library": "1.6.1"
   },
  "frameworks": {
    "netstandard1.3": {}
  }
}
Run Code Online (Sandbox Code Playgroud)

.net c# .net-core .net-standard-1.5

8
推荐指数
1
解决办法
1668
查看次数

在dotnet核心中读取json文件时出错"已达到inotify实例数量的已配置用户限制(128)"

我有一个控制台应用程序(在网络核心1.1中),它每隔1分钟在cron调度程序中安排一次.在应用程序内部有调用配置文件.我附上下面的代码.

public static T GetAppConfig<T>(string key, T defaultValue = default(T))
{

    T value = default(T);
    logger.Debug($"Reading App Config {key}");
    try
    {
        var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
        var builder = new ConfigurationBuilder()
            .AddJsonFile($"appsettings.json", true, true)
            .AddJsonFile($"appsettings.{environmentName}.json", true, true)
            .AddEnvironmentVariables();
        var configuration = builder.Build();
        T setting = (T)Convert.ChangeType(configuration[key], typeof(T));
        value = setting;
        if (setting == null)
            value = defaultValue;
    }
    catch (Exception ex)
    {
        logger.Warn(ex, $"An exception occured reading app key {key} default value {defaultValue} applied.");
        value = defaultValue;
    }
    return value;
} …
Run Code Online (Sandbox Code Playgroud)

c# .net-core asp.net-core .net-standard

8
推荐指数
2
解决办法
5754
查看次数

为netstandard Xamarin.Forms项目生成WCF客户端代理

我创建了一个带有netstandard2.0目标库而不是共享库或PCL库的Xamarin.Forms项目.到目前为止,这编译和工作.我正在使用Visual Studio 2017社区的up2date版本.

我还创建了一个WCF服务,它将托管在Windows本身(而不是IIS)上.我已将app.config配置为提供元数据交换端点:

<?xml version="1.0"?>
<configuration>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
    </startup>
    <system.serviceModel>
        <services>
            <service behaviorConfiguration="MM.Server.ServiceServerBehavior" name="MM.Server.ServiceServer">
                <endpoint address="net.tcp://localhost:8730/MMServer/" binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IServiceServer" bindingName="NetTcpBinding_IServiceServer_EndPoint" contract="MM.Contracts.IServiceServer">
                    <identity>
                        <dns value="localhost"/>
                    </identity>
                </endpoint>
                <endpoint address="http://localhost:8731/MMServer/mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
                <host>
                    <baseAddresses>
                        <add baseAddress="net.tcp://localhost:8730/MMServer/"/>
                    </baseAddresses>
                </host>
            </service>
        </services>
        <behaviors>
            <serviceBehaviors>
                <behavior name="MM.Server.ServiceServerBehavior">
                    <serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:8731/MMServer/mex" />
                    <serviceDebug includeExceptionDetailInFaults="true"/>
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <bindings>
            <netTcpBinding>
                <binding name="NetTcpBinding_IServiceServer" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" hostNameComparisonMode="StrongWildcard" listenBacklog="10" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxConnections="10" maxReceivedMessageSize="2147483647">
                    <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="16384"/>
                    <reliableSession ordered="true" …
Run Code Online (Sandbox Code Playgroud)

wcf slsvcutil xamarin .net-standard

8
推荐指数
1
解决办法
1192
查看次数

在一个库/ NuGet包中支持多个版本的NuGet包

我想要的是

我希望我的库能够使用各种版本的NuGet包,并在更改之间对API进行重大更改.我没有进一步调查,但这条路看起来很有希望:

  • 通过指定extern命名空间别名来引用具有不同API的库的所有版本.
  • 为所需的类创建代理,使用flags/exceptions/what来告诉实际支持的内容.
  • 根据实际加载到应用程序中的版本,在运行时选择正确的代理.
  • 依赖于不存在的API的代码将不会被调用,因此一切都应该正常工作.

虽然这可能看起来很复杂,但它比在单独的程序集中支持每个版本的更直接的方法有许多好处:

  • 我的库的版本不会像1.2.3-for-2.3.4-to 2.6.8那样乱成一团.在这种情况下,我甚至不知道版本控制应该如何工作.
  • NuGet用户不必在几个包之间进行选择,一个包适合所有包.
  • 升级版本很简单,不需要删除和添加我的包.

问题

但是,目前还不清楚它是否可能.甚至在获得代理和检测当前版本之前,我就坚持了基础知识.

我甚PackageReference至无法向我的.csproj 添加多个节点,只有一个参考实际上有效.有一个解决方法来添加 NuGet不直接支持的外部别名,但我无法达到这一点,因为我无法获得两个引用.如果我以某种方式得到两个,我将无法区分它们.

问题

  1. 可以使用extern命名空间别名和代理以这种方式实现对多个版本的支持吗?
  2. 如果是,如何添加对NuGet包的多个版本的引用并在代码中使用它们?
  3. 如果没有,那么正确的方法是什么?

背景

我正在使用CsConsoleFormat库来格式化控制台输出.我希望直接支持流行的命令行软件包的所有相关版本,这样无论使用什么命令行解析库,都可以添加几乎没有编码的漂亮命令行帮助和类似的东西.

我想在我的案例中声称"我只支持最新版本"在某种程度上是可以接受的,但即使它更复杂,我也宁愿得到更广泛的支持.理想情况下,我想要一个NuGet包,它声明对最低支持版本的依赖,但支持最新版本的所有内容.

到目前为止进展

我有点工作,但有很多问题.有关详细信息,请参阅GitHub NuGet Home上的问题.

.net c# msbuild nuget

8
推荐指数
2
解决办法
2511
查看次数

在.NET中序列化大量链接的数据(自定义JSON.NET引用)

我希望在序列化数据时避免重新发明轮子.我知道一些方法来序列化彼此链接的对象,但它的范围从编写一些代码到编写大量用于序列化的代码,我想避免这种情况.必须有一些通用的解决方案.

假设我有这样的结构:

Person
    bro = new Person { name = "bro", pos = new Pos { x = 1, y = 5 } },
    sis = new Person { name = "sis", pos = new Pos { x = 2, y = 6 } },
    mom = new Person { name = "mom", pos = new Pos { x = 3, y = 7 }, 
        children = new List<Person> { bro, sis }
    },
    dad = new Person { name …
Run Code Online (Sandbox Code Playgroud)

.net c# serialization json json.net

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

分离视图,命令演示(文本,图标)和命令逻辑(执行,CanExecute)

如果TL; DR:见最后一段.

Pure WPF"建议"将表示(控件,文本,图标)放入视图和命令逻辑(Execute,CanExecute方法)到代码隐藏中.除了将逻辑放入视图(CommandBindings)和代码隐藏是一个不受欢迎的练习之外,它对XAML重复没有任何帮助:每次命令都必须复制文本,图标,大图标,提示和许多其他属性用于:主菜单,上下文菜单,工具栏按钮,功能区按钮和其他控件.

看起来像第一个问题(真正分离的观点和逻辑)被解决DelegateCommand,RelayCommand并且接近这样.命令逻辑被移动到ViewModels(或MVVMC中的控制器),代码隐藏是清晰的,没有CommandBindings和其他无意义的视图.

但是,我找不到一个普遍接受的演示文稿重复问题的解决方案.我想分离命令演示(文本,图标)和命令逻辑(Execute,CanExecute方法).所有的代码,我能找到要么把文稿分为代码(通过创建一个RoutedCommand与像附加属性LabelIcon),或者把代码放到呈现(即,处理到的意见和代码隐藏).我也不喜欢.我认为演示应该完全在XAML中,代码应该完全在CS中(在ViewModel或Controller中).

问题:如何分离视图(XAML与对照其参考命令),命令呈现(标签,图标等等.对每一个指令)和(为C#代码命令的逻辑Execute,CanExecute在的ViewModels或控制器等)?

c# wpf xaml routed-commands mvvm

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