在C#中,当一个字段可能是字符串或字符串数​​组时,如何反序列化此json?

我有一个asp.net-mvc网站,我正在从数据库中读取Json字符串。 以下是DB中的以下json。 它可能看起来像这样: {“description”: “Test”, “contacts”: [“joe@gmail.com”, “bill@yahoo.com”], “enabled”: true} 或这个: {“description”: “Test”, “contacts”: “joe@gmail.com, bill@yahoo.com”, “enabled”: true} 如您所见,联系人字段是: 一个字符串(用逗号分隔的项目) 一串字符串。 我想转换为这个类: public class MyJob { public string description; public string[] contacts; public string enabled; } 当我尝试使用JavascriptSerializer()仅指定一个字符串(将上面的内容更改为:public string contacts;)时: var serializer = new JavaScriptSerializer(); string contacts = serializer.Deserialize(theAboveJsonString).contacts; 我在它的数组的情况下得到这个错误: 类型’System.String’不支持反序列化数组。 什么是反序列化处理以下情况的最佳方法: 一个字符串 一串字符串。 对于联系人字段。 我很乐意提出所需的任何条件逻辑。 […]

为什么Dispatcher.BeginInvoke为ThreadStart解包TargetInvocationException而不为Action解包?

考虑以下两个应用程序: 1: public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); this.Dispatcher.UnhandledException += Dispatcher_UnhandledException; } void Dispatcher_UnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) { System.Diagnostics.Debug.WriteLine(e.Exception.GetType()); } private void Button_Click(object sender, RoutedEventArgs e) { this.Dispatcher.BeginInvoke((ThreadStart)delegate { throw new AccessViolationException(“test”); }, DispatcherPriority.Input); } } 2: public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); this.Dispatcher.UnhandledException += […]

我可以直接从HttpResponseMessage流式传输到文件而无需通过内存吗?

我的程序使用HttpClient向Web API发送GET请求,并返回一个文件。 我现在使用此代码(简化)将文件存储到光盘: public async Task DownloadFile() { var client = new HttpClient(); var uri = new Uri(“http://somedomain.com/path”); var response = await client.GetAsync(uri); if (response.IsSuccessStatusCode) { var fileName = response.Content.Headers.ContentDisposition.FileName; using (var fs = new FileStream(“C:\test\” + fileName, FileMode.Create, FileAccess.Write, FileShare.None)) { await response.Content.CopyToAsync(fs); return true; } } return false; } 现在,当此代码运行时,该进程会将所有文件加载到内存中。 我实际上宁愿期望流从HttpResponseMessage.Content流式传输到FileStream,因此只有一小部分流被保存在内存中。 我们计划在大文件(> 1GB)上使用它,那么有没有办法在没有内存中的所有文件的情况下实现它? […]

我的WPF自定义控件的数据上下文正在取代父级

在我的主窗口中,我尝试绑定到一个布尔。 但它正在查看我的自定义控件的数据上下文。 如果我没有在用户控件中分配DataContext,那么主窗口的绑定工作,但(显然)这会在用户控件中制动绑定。 这是错误: System.Windows.Data Error: 40 : BindingExpression path error: ‘MyControlVisible’ property not found on ‘object’ ”MyUserControlModel’ (HashCode=1453241)’. BindingExpression:Path=MyControlVisible; DataItem=’MyUserControlModel’ (HashCode=1453241); target element is ‘MyUserControl’ (Name=’_myUserControl’); target property is ‘Visibility’ (type ‘Visibility’) 我需要绑定才能在两个控件上工作,但我不希望用户控件的datacontext取代窗口。 这是代码: namespace Sandbox { public partial class MainWindow { private MainWindowModel model; public MainWindow() { InitializeComponent(); DataContext = model = new […]

将单独的XAML导入为ResourceDictionary并分配x:Key

我下载了Visual Studio图像库 ,我看到包含的图标以.XAML文件的forms提供矢量格式。 这是一个例子: Add_16x.xaml 我想将我想要在我的应用程序源中使用的所有图标xaml文件放在名为“Icons”的文件夹中,然后能够在其他地方IconDictionary.xaml一个名为IconDictionary.xaml的文件,该文件定义了一个包含MergedDictionaries的ResourceDictionary并在此MergedDictionaries希望能够以某种方式包含icon.xaml文件并为它们分配一个x:Key属性,以便我可以在整个应用程序中将它们称为静态资源。 是否可以使用此icon.xaml文件而无需修改.xaml文件本身? 我希望能够保留它们,但不幸的是,似乎我别无选择,只能将其内容复制到我的IconDictionary.xaml或编辑单个.xaml文件并将它们包含在带有x:Key的ResourceDictionary x:Key我可以添加到MergedDictionaries x:Key 。 UPDATE 为了清楚起见,我希望我的IconDictionary.xaml看起来像这样:

强制EditorFor在视图上使用类名为输入项添加前缀?

我有一个EditorFor: model.Client, “ClientTemplate”, new { editing = false })%> 这将绑定到视图正常(如预期)但在模型发布时不会绑定绑定。 这是因为表单id没有以“Client”为前缀。 通常在这种情况下,我只是传入模型,然后将输入绑定到模板中的model.Client.PropertyName,但在这种情况下,这不是一个选项,因为模板用于两个不同的视图模型(有客户端)。 有关正确绑定的任何建议吗? 非常感谢,Kohan。 附录 这似乎是我的一个误解,我现在明白这个问题是fluentHtml在EditorFor Templates中不起作用。 (同样适用于此修复,因为事实certificate不需要,因为如果我用正常的mvc html助手替换fluentHtml,EditorFor会自动为我添加前缀)

在SortedDictionary中查找最接近的值

我有一个SortedDictionary SortedDictionary myDict; 现在我想找到X之上的第一个值。我可以做这样的事情 foreach (var iKey in MyDict.Keys) { if (iKey >= thresholdKey) { foundKey = iKey; break; } } 但这并不是明智的表现。 还有更好的建议吗? (在集合中是否有一种方法可以像二进制搜索SortedDictionary那样?)

c#为什么当路径为“C:”时,directoryInfo将我带到应用程序文件夹?

为什么当我给出路径“c:”时,它直接将我改为应用程序文件夹? static void Main(string[] args) { DirectoryInfo dir = new DirectoryInfo(“c:”); Console.WriteLine(dir.FullName); Console.ReadLine(); } 输出如下: c:\ users … \ documents \ visual studio 2010 \ projects \ consoleApplication9 \ bin \ debug 但是当我给@”c:\”它会转到磁盘c:尽管”d:”和@”d:\”占用磁盘d: . 所以我需要一种让”c:”进入磁盘c: 提前致谢!

应该在Repository还是Service层中编写复杂的查询?

我计划将数据访问层迁移到使用存储库模式和工作单元。 我知道存储库将帮助我轻松地将持久性存储(数据库,集合等)和EF等技术更改为MongoDB。 所以我注意到了一些存储库实现的关键点,例如: 返回IEnumerable而不是IQueryable 存储库应仅对CRUD操作负责 存储库方法的返回类型应该是模型(实体) 仅实现聚合根的存储库 如果我在项目中的实现存储库中应用这些关键点,我完全忘记了如何处理与多个实体相关的复杂查询。 目前我已经拥有的是在BLL库上有很多服务类将直接联系到EF的DbContext和DbSet以及一些这样的validation: public IEnumerable GetProjectWithDetails() { // Validation // Logging // Can be any logic need to before query data. Dbcontext.Projects.Where(p => // multiple of conditions go here follow business rules // conditions will need to check another entities (task, phase, employee…) such as: // 1. project have […]

如何从服务器上正常关闭套接字

在服务器端,我正在尝试优雅地关闭连接的套接字。 我知道Socket上正确的事件序列应该是: socket使用SocketShutdown.Send选项关闭 loop / wait直到套接字Receive返回0字节 套接字关闭 我有几个问题: 如果Socket.Receive永远不会返回(0字节)怎么办? 我们会不会试图永远关闭套接字? 每当我在服务器上调用Close时,客户端总是会收到“现有连接被远程主机强行关闭”的exception。 我怎样才能让客户通知这个关闭“优雅”? 在服务器上,如果我正在使用Async Begin / EndReceive调用,每当我在套接字上调用Close时,它总是会在Begin / EndReceive线程上导致ObjectDisposedException。 如果没有发生此exception,是否无法关闭套接字?