小编tme*_*ser的帖子

在JSON.NET中为反序列化转换接口

我正在尝试建立一个读取器,它将从各种网站中获取JSON对象(想想信息抓取)并将它们转换为C#对象.我目前正在使用JSON.NET进行反序列化过程.我遇到的问题是它不知道如何处理类中的接口级属性.所以有些本质:

public IThingy Thing
Run Code Online (Sandbox Code Playgroud)

会产生错误:

无法创建IThingy类型的实例.Type是接口或抽象类,无法实例化.

让它成为ITINGy而不是Thingy是相对重要的,因为我正在处理的代码被认为是敏感的,单元测试非常重要.对于像Thingy这样的完全成熟的对象,不可能对原子测试脚本的对象进行模拟.它们必须是一个接口.

我一直在研究JSON.NET的文档已有一段时间了,我在这个网站上找到的与此相关的问题都来自一年多以前.有帮助吗?

此外,如果重要,我的应用程序是用.NET 4.0编写的.

.net c# json json.net

116
推荐指数
10
解决办法
11万
查看次数

实体框架:从哪里获取这些列?

我们正在尝试使用现有数据库在我们的商店中使用Entity框架(因此,更改数据库模式不是一个选项),并且我们为测试事物创建的单元测试显示了一些非常奇怪的行为.

这是它为我们拥有的特定对象吐出的SQL:

SELECT 
[Extent1].[CommentTypeId] AS [CommentTypeId], 
[Extent1].[DataPartId] AS [DataPartId], 
[Extent1].[CommentId] AS [CommentId], 
[Extent1].[CreatedTime] AS [CreatedTime], 
[Extent1].[Message] AS [Message], 
[Extent1].[From] AS [From], 
[Extent1].[Likes] AS [Likes], 
[Extent1].[SourceTypeId] AS [SourceTypeId], 
[Extent1].[StatusMessage_DataPartId] AS [StatusMessage_DataPartId], 
[Extent1].[Album_DataPartId] AS [Album_DataPartId]
FROM [dbo].[Comments] AS [Extent1]
Run Code Online (Sandbox Code Playgroud)

正如您可能注意到的那样,请求的最后两列与其他列不同.那是因为它们实际上并不存在,我们不知道实体为什么要求它们!我们的配置文件和我们的POCO都没有提及它们.事实上,就我们的数据库而言,它们是完全独立的概念,并不是直接相关的.

从哪里获取这些列,以及如何告诉它将其删除?

编辑:回答下面的一些问题,1)我们正在使用实体框架4.2.我们正在使用流畅的映射.

2)POCO本身看起来像是这样,为了简洁起见,切除了平等的混乱:

public long DataPartId { get; set; }
public string CommentId { get; set; }
public DateTime? CreatedTime { get; set; }
public string Message { get; set; }
public string From { get; set; }
public int? Likes { …
Run Code Online (Sandbox Code Playgroud)

c# database entity-framework

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

使用正则表达式读入文件?

这与我早先的一个问题相关.

从本质上讲,该问题的解决方案效果很好,但现在我需要使其适应更大的分析应用程序.简单地使用StreamReader.ReadToEnd()是不可接受的,因为我将要阅读的一些文件非常非常大.如果出现了错误并且有人忘记清理,理论上它们可能是千兆字节.显然,我不能只读到最后.

不幸的是,正常的读取行也是不可接受的,因为我读入的一些数据行包含堆栈跟踪 - 它们显然/r/n在它们的格式化中使用.理想情况下,我想告诉程序向前读取,直到匹配正则表达式,然后返回.在.net中有任何功能吗?如果没有,我可以就如何编写它获得一些建议吗?

编辑:为了更容易理解我的问题,这里贴了一些改编代码的重要部分:

foreach (var fileString in logpath.Select(log => new StreamReader(log)).Select(fileStream => fileStream.ReadToEnd()))
{
    const string junkPattern = @"\[(?<junk>[0-9]*)\] \((?<userid>.{0,32})\)";
    const string severityPattern = @"INFO|ERROR|FATAL";
    const string datePattern = "^(?=[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3})";
    var records = Regex.Split(fileString, datePattern, RegexOptions.Multiline);
    foreach (var record in records.Where(x => string.IsNullOrEmpty(x) == false))
    ......
Run Code Online (Sandbox Code Playgroud)

问题在于Foreach. .Select(fileStream => fileStream.ReadToEnd())会严重炸掉记忆,我才知道.

.net c# regex streamreader

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

抽象类继承另一个抽象类问题

我有一个继承架构,如下所示:

public abstract class BaseAttachment
{
    public abstract string GetName();
}

public abstract class BaseFileAttachment:BaseAttachment
{
    public abstract string GetName();
}

public class ExchangeFileAttachment:BaseFileAttachment
{
    string name;
    public override string GetName()
    {
        return name;
    }
}
Run Code Online (Sandbox Code Playgroud)

我基本上想调用ExchangeFileAttachment类的GetName()方法; 但是,上述声明是错误的.对此有任何帮助表示赞赏.谢谢

.net c# inheritance abstract-class encapsulation

5
推荐指数
2
解决办法
2万
查看次数

数组和线程安全访问

如果我有一个可以/将在任何给定时间点被多个线程访问的数组,究竟是什么导致它是非线程安全的,以及为确保该数组在大多数情况下是线程安全所采取的步骤情况呢?

我已经在互联网上广泛了解并且发现很少或没有关于这个主题的信息,一切似乎都是特定的场景(例如这个数组,这两个线程通过这两个线程安全地访问,然后开启,等等).我真的希望有人可以回答我在顶部提出的问题,或者是否有人可以指出解释所述项目的好文件.

编辑:在MSDN上查看后,我找到了ArrayList类.使用synchronize方法时,它返回给定列表的线程安全包装器.在列表中设置数据时(即list1 [someNumber] = anotherNumber;)包装器是否自动处理锁定列表,还是需要锁定它?

.net c# arrays

4
推荐指数
1
解决办法
8346
查看次数

如何解决KeyNotFoundException问题

我使用以下内容将JSON字符串反序列化到我自己的类中:

JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> x = (Dictionary<string, object>)serializer.DeserializeObject(json);
MyJsonStruct data = serializer.Deserialize<MyJsonStruct>(x["d"].ToString());
Run Code Online (Sandbox Code Playgroud)

但是一旦JavaScriptSerializer.Deserialize()调用该方法,就会抛出异常:

A first chance exception of type 'System.Collections.Generic.KeyNotFoundException' occurred in mscorlib.dll
System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
   at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
Run Code Online (Sandbox Code Playgroud)

有没有办法找出触发异常的

用于解决此类异常的一般技术(或配方)将是最受欢迎的.

更新:如果我删除[d],我收到以下内容:

A first chance exception of type 'System.ArgumentException' occurred in System.Web.Extensions.dll
System.ArgumentException: Invalid JSON primitive: System.Collections.Generic.Dictionary.
   at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject()
   at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)
   at System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)
   at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, …
Run Code Online (Sandbox Code Playgroud)

.net c# javascriptserializer

4
推荐指数
1
解决办法
1万
查看次数

RabbitMQ:注入连接工厂

我正在尝试为我正在编写的一对Windows服务设置RabbitMQ,以便以快速可靠的方式促进它们之间的通信.但是,我在尝试设置主要的Windows服务引擎时遇到了问题,这些引擎需要建立与RabbitMQ服务器的连接来完成它们的工作.

基本上,ConnectionFactoryRabbitMQ的.NET客户端中的对象不是抽象的,并且不实现任何接口.我看不到使用像StructureMap这样的IoC容器注入这个类的明显方法.甚至文档中的代码示例也只是公然显示new它,如下所示:

 ConnectionFactory factory = new ConnectionFactory();
 factory.Uri = "amqp://user:pass@hostName:port/vhost";
 IConnection conn = factory.CreateConnection();
Run Code Online (Sandbox Code Playgroud)

向我展示的解决方案是将整个工厂推向服务的主要部分OnStartOnStop功能,这些都非常难以测试,而且无论如何都没有太大的兴趣.但是,这使我只有一个IConnection服务,所以如果该连接以任何方式被破坏,服务无法恢复,必须简单地退出.如果主引擎可以看到工厂,它可以简单地产生一个新连接并继续.但除非我注入,否则没有连接到现有服务器就无法测试主引擎!

这里有什么我想念的吗?还有其他我不考虑的选择吗?如何注射这个工厂,如果我不能,我怎样才能限制损坏?

编辑:另外,作为一个事后的想法,我非常高兴能够改变RabbitMQ的.NET客户端来实现这个界面,如果有人知道主开发团队对这样的变化有多接受.我很乐意做出贡献,但我想做的最后一件事是让我的程序处理一些自定义版本的RabbitMQ,从而消除了首先使用第三方库的主要好处.

.net c# dependency-injection rabbitmq

4
推荐指数
2
解决办法
5589
查看次数

C#方法名称预期 - 多线程

我用C#创建了这个程序,但是我得到了一个'方法名称预期'错误.我究竟做错了什么?

for (int i = 0; i < numberofThreads2; i++)     
{   
    Thread thread1 = new Thread(new ThreadStart (Start(1, 2, 3, 4, 5)));
    thread1.Start();
}
Run Code Online (Sandbox Code Playgroud)

.net c# multithreading

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

在VIM中使用大括号内的文本小写

我在mailchimp中使用了许多电子邮件模板,目前正在使用标准的合并标签ala *|SUBJECT|*.我想将这些模板转换为Handlebars用法.

我可以轻松地使用%sno/*|/{{%sno/|*\}}交换标记分隔符,但是这给我留下了全部大写字母,比如{{SUBJECT}}.是否有一个很好的命令强制在VIM中的双花括号内部强制小写,所以我不必追捕并更改每个变量?

更快的问题描述:

我在电子邮件模板中有很多这样的情况:

<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>*|SUBJECT|*</title>
Run Code Online (Sandbox Code Playgroud)

我反而想要这个:

<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{{subject}}</title>
Run Code Online (Sandbox Code Playgroud)

到达那里需要什么样的VIM命令?

html vim handlebars.js

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

数组检查:对象引用未设置为对象的实例

我正在努力找到解决这个问题的方法.我在这个网站上看到很多关于这个主题的类似条目,但我似乎无法找到解决方案.我正在尝试检查缓存中的表以查看它是否已存在,如果没有,则填充它.下面是我检查的代码,它在'if'语句中的错误告诉我'System.NullReferenceException:对象引用没有设置为对象的实例'.这令人费解,因为'.IsNullOrEmpty'不应该抓住这个吗?我想如果数组中的第一个元素是null或为空,那么它还没有被缓存,因此采取行动.

            string[] saveCatList = Cache["Categories" + Session["sessopnID"]] as string[];
            if (string.IsNullOrEmpty(saveCatList[0]))
            {
                WBDEMOReference.getcatlist_itemcategories[] categories;
                strResult = callWebServ.getcatlist(Session["sessionID"].ToString(),
                            out strResultText, out dNumOfCat, out categories);

                for (int i = 0; i < categories.Length; i++)
                {
                    //ddCat is the ID number of the category drop down list
                    ddCat.Items.Add(new ListItem(categories[i].categorydesc.ToString(),
                                                 categories[i].categorynumber.ToString()));
                }
            }
Run Code Online (Sandbox Code Playgroud)

c# arrays

0
推荐指数
1
解决办法
1565
查看次数