小编Roz*_*wel的帖子

在没有索引的集合上实现INotifyCollectionChanged

在ASP.Net专门工作了几年之后,我刚刚在WPF中弄湿了脚趾.我目前正在努力解决的问题是我有一个自定义集合类,我需要绑定到列表框.除了从集合中删除项目之外,一切似乎都在起作用.当我尝试得到错误时:问题“Collection Remove event must specify item position.” 是这个集合不使用索引,所以我没有看到指定位置的方法,到目前为止谷歌没有向我展示一个可行的解决方案......

该类被定义为实现ICollection<>INotifyCollectionChanged.我的内部项容器是一个Dictionary使用项的名称(字符串)值的键.除了这两个接口定义的方法之外,此集合还有一个索引器,允许通过Name访问项目,并覆盖ContainsRemove方法,以便也可以使用项目Name调用它们.这适用于添加和编辑,但在我尝试删除时会抛出上述异常.

以下是相关代码的摘录:

class Foo
{
    public string Name
    {
        get;
        set;
    }
}
class FooCollection : ICollection<Foo>, INotifyCollectionChanged
{
    Dictionary<string, Foo> Items;

    public FooCollection()
    {
        Items = new Dictionary<string, Foo>();
    }

    #region ICollection<Foo> Members

    //***REMOVED FOR BREVITY***

    public bool Remove(Foo item)
    {
        return this.Remove(item.Name);
    }
    public bool Remove(string name)
    {
        bool Value = this.Contains(name);
        if (Value)
        {
            NotifyCollectionChangedEventArgs E = new …
Run Code Online (Sandbox Code Playgroud)

c# wpf

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

在单元测试中创建多个部分/混合表单请求

我正在开发一个Web API端点,它将接受多部分/混合消息作为POST.我面临的问题是如何在单元测试中模拟这样的请求?

API方法的核心是:

public HttpResponseMessage Post(){
    var parsedContent=Request.Content.ReadAsMultipartAsync().Result;
    foreach(var item in parsedContent.Contents) {
        switch(item.Headers.ContentType.MediaType){
            case "application/json":
                doSomething(item);
                break;
            case "text/plain":
                doSomethingElse(item);
                break;
            case "application/pdf":
                doAnotherThing(item);
                break;
            case "image/png":
                doYetAnotherThing(item);
                break;
        }
    }
    //return status message based on results of previous calls...
}
Run Code Online (Sandbox Code Playgroud)

我知道在测试中调用post之前,我必须创建请求对象并将测试条件置于其中,然后控制器.我在排序时遇到的麻烦是将多部分内容转换为正确的ReadAsMultipartAsync()呼叫形式的正确方法.

我将这个方法拼凑在一起,当它被输入上面的控制器时,它所创建的请求被正确接受和解析.但是,设置断点并检查请求对象在通过此测试构建时与fiddler之类的内容生成并通过管道进入时看起来非常不同.System.Web.Http.WebHost.HttpControllerHandler.LazyStreamContent测试调试时,管道具有类型的内容System.Net.Http.MultipartContent.

public static HttpRequestMessage CreateMixedPostRequest(string url, IEnumerable<HttpContent> contentItems) {
    var request=new HttpRequestMessage(HttpMethod.Post, url);
    var content=new MultipartContent("mixed");
    foreach(var item in contentItems) {
        content.Add(item);
    }
    request.Content=content;
    return request;
}
Run Code Online (Sandbox Code Playgroud)

我想我担心这种技术会导致错误的安全感,因为测试不会以与管道生效时相同的格式向控制器提供内容.有没有更好的方法来构建我的测试请求?或者我是否过于偏执,这对我的情景来说是一个可行的选择?

编辑:我们已经达到了尝试从外部代码测试此端点的程度,我们发现LazyStream和Multipart之间存在显着的性能差异.在提交与内部测试相同的数据时,外部代码通常会超时.

c# unit-testing multipart asp.net-web-api2

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

如何使用Dapper从oracle读取时间偏移量

我将数据存储在oracle TIMESTAMP WITH TIME ZONE列中,我现在尝试使用Dapper将其读回到C#DateTimeOffset变量中.问题是dapper会忽略数据库中的偏移值,并始终使用环境的当前偏移量填充我的变量.

有没有一种简单的方法让dapper识别数据库的偏移值?

基本上我想看到这些方面的工作:

var input=new DateTimeOffset(2016, 3, 15, 14, 30, 0, TimeSpan.Zero);
DateTimeOffset output;
using(var connection=new OracleConnection(QueryConnectionString)) {
    output=connection.ExecuteScalar<DateTimeOffset>("Select to_timestamp_tz('"+input.ToString("yyyy-MM-dd HH:mm zzz")+"', 'YYYY-MM-DD HH24:MI TZH:TZM') From DUAL");
}
Assert.AreEqual(input, output);
Run Code Online (Sandbox Code Playgroud)

如此编写,这给出了无效的强制转换异常,看起来dapper将其作为DateTime读取,然后尝试将其强制转换为DateTimeOffset,忽略偏移值.

查询表并填充使用这些类型定义的类对象的代码不会引发错误,但它会使用本地偏移量而不是数据库中的值填充对象实例.所以如果我使用上面的输入值,我最终会用2016-03-15 14:30 -5而不是2016-03-15 14:30 +0.

c# oracle timezone dapper

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

标签 统计

c# ×3

asp.net-web-api2 ×1

dapper ×1

multipart ×1

oracle ×1

timezone ×1

unit-testing ×1

wpf ×1