小编Can*_*cer的帖子

在编写具有多种类型的通用扩展方法时,键入推断问题

我正在为IEnumerable编写一个通用扩展方法,用于将对象列表映射到另一个映射对象列表.这就是我希望该方法工作的方式:

IList<Article> articles = GetArticles();
return articles.Map<ArticleViewModel>(_mappingEngine);
Run Code Online (Sandbox Code Playgroud)

这是方法:

public static IEnumerable<T2> Map<T1, T2>(this IEnumerable<T1> list, IMappingEngine engine)
{
    return list.Select(engine.Map<T1, T2>);
}
Run Code Online (Sandbox Code Playgroud)

但是articles.Map<ArticleViewModel>(_mappingEngine); 会出现编译错误.问题是T1的类型推断不起作用.我必须明确地这样称呼它:

articles.Map<Article, ArticleViewModel>(_mappingEngine);
Run Code Online (Sandbox Code Playgroud)

如果我创建一个只有一个参数T1的扩展方法,如下所示:

public static IEnumerable<T1> DummyMap<T1>(this IEnumerable<T1> list, IMappingEngine engine)
{
    return list;
}
Run Code Online (Sandbox Code Playgroud)

然后我可以像这样调用它,而不必指定T1:

articles.DummyMap(_mappingEngine);
Run Code Online (Sandbox Code Playgroud)

有没有理由说编译器无法在Map的扩展方法中推断出T1的类型?

c# generics extension-methods c#-3.0

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

C++ 增量构建以实现持续集成

我们在 VS2005 中构建了一个相当大的 C++ 项目,从头开始编译和构建可能需要长达 40 分钟的时间,安装程序还需要 10 分钟,因为该软件是在 32 位和 64 位配置中构建的。我希望将这个时间减少到至少 10 分钟左右,因为我觉得在使用持续集成时获得快速构建反馈很重要。

当通过删除最终链接文件而不是 .obj 文件来使用增量构建时,构建过程似乎要快得多,但似乎会到处弹出错误,例如无法加载 .dll。从干净的构建开始一切正常。我选择使用 TeamCity 作为 CI 系统。

也许增量构建行为在 Visual Studio 的更高版本中更好,并且可能是升级的良好动力?有人遇到过类似的问题吗?

c++ build-automation visual-c++ incremental-build

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

Html.DropDownListFor() - 如何为强类型视图设置默认选定值?

使用ASP.NET MVC 3,我一直在努力为强类型视图使用帮助Html.DropDownListFor()函数设置下拉列表的选定值.

模型的代码如下所示:

public class ResourceView
{
   ...
   public Language Language { get; set; }
}

public class Language
{
   public string DisplayName { get; private set; }      
   public string Code { get; private set; }    
   public override string ToString() {  return DisplayName;  }
}
Run Code Online (Sandbox Code Playgroud)

并在视图内:

@Html.DropDownListFor(model => model.Language, 
  new SelectList(ViewBag.AllPossibleLanguages, 
    "Code", "DisplayName", Model.Language.Code))
Run Code Online (Sandbox Code Playgroud)

有一些解决方法,例如使用

@Html.DropDownList("LanguageCode", 
   new SelectList(ViewBag.PossibleLanguages,
      "Code", "DisplayName", Model.Language.Code))
Run Code Online (Sandbox Code Playgroud)

而且奇怪的是,如果第一个参数设置为"语言",则上述代码不起作用,与模型中属性的名称相同.

我也可以这样做

@Html.DropDownListFor(model => model.Language, 
  new SelectList(ViewBag.AllPossibleLanguages))
Run Code Online (Sandbox Code Playgroud)

它将与适当的选定值一起工作,但是只会显示Language类的ToString()值,并且不会设置我想要的选项标签中的实际语言代码,这并不奇怪,因为它有没有任何标识可以将Code字段用作value属性.

我也可以使用jquery事件处理程序来解决这个问题,该事件处理程序之后会选择适当的值.但是我很好奇为什么这不能按预期工作,并且如果可能的话想要正确地解决它.

c# asp.net-mvc-3

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

ASP.NET MVC 3模型绑定资源

我正在寻找一个很好的资源,它非常详细地描述了模型绑定如何与ASP.NET MVC 3(或在较小程度上,MVC 2)和不同方法一起工作.我没有找到关于这个主题的任何好资源,除了那里的点点滴滴.网上的信息更多地是关于"如何做X"而不是解释模型绑定的内部如何工作.有什么建议?书籍推荐也很好.

.net asp.net model-binding asp.net-mvc-3

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

将静态类型对象扩展为动态对象

dynamic在视图模型中使用对象,因为我发现使用 Automapper 之类的东西不必要的开销,并且发现这种方法更加灵活和轻量级。我正在使用来自即兴界面的构建器,如下所示:

private dynamic New = Builder.New();

private dynamic GetViewModel(Product p)
{
    var viewModel = New.Product( id : p.Id, name : p.Name );
    viewModel.AdditionalProperty = "some additional data";
    return viewModel;
}
Run Code Online (Sandbox Code Playgroud)

在某些情况下,“扩展”实际对象会比逐一重新映射所有属性更好,类似于在 JavaScript 中使用jQuery.extend()

private dynamic GetViewModel(Product p)
{
    var viewModel = //create base dynamic object, that has all the members of p.
    viewModel.AdditionalProperty = "some additional data";
    return viewModel;
}
Run Code Online (Sandbox Code Playgroud)

这应该可以通过ExpandoObject结合反射和迭代所有成员来实现,但我想知道是否有更干净/更整洁的解决方案。

c# dynamic impromptu-interface

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