小编mht*_*ttk的帖子

什么<在TFrom,out TTo>是什么意思?

Resharper建议改变

interface IModelMapper<TFrom, TTo>
{
    TTo Map(TFrom input);
}
Run Code Online (Sandbox Code Playgroud)

interface IModelMapper<in TFrom, out TTo>
Run Code Online (Sandbox Code Playgroud)

所以我调查了一下,结束了阅读这篇文章(通过维基百科的文章找到)和更多的谷歌.

我仍然不确定这对我的申请意味着什么,所以我很想接受这个建议.这种改变会带来什么好处,我不考虑忽视这个建议?

更明确的是,我为什么要接受它?

c# generics covariance contravariance

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

以编程方式在类的每个属性上插入方法调用

我的问题是基于这篇文章.

基本上,类可以实现Freezable方法,以确保在对象进入Frozen状态后不能更改任何属性.

我有一个遵循这种设计的界面

public interface IFreezableModel
{
    void Freeze();
    bool IsFrozen{get;}
}
Run Code Online (Sandbox Code Playgroud)

目标是确保一旦调用Freeze方法,IsFrozen属性设置为True,并且不再更改对象的属性.

为简化起见,我将使用一个抽象基类:

public abstract class BaseFreezableModel : IFreezableModel
{
    public void Freeze()
    {
        _isFrozen = true;
    }
    public bool IsFrozen
    { 
       get {return _isFrozen;}            
    }
    protected ThrowIfFrozen()
    {
       if (IsFrozen)
           throw new Exception("Attempted to change a property of a frozen model");
    }
}
Run Code Online (Sandbox Code Playgroud)

这样我就可以上课了

public class MyModel : BaseFreezableModel
{
     private string _myProperty;
     public string MyProperty
     {
        get{return _myProperty;}
        set 
        {
           ThrowIfFrozen();
           _myProperty = value;
        } …
Run Code Online (Sandbox Code Playgroud)

.net c#

19
推荐指数
3
解决办法
2298
查看次数

OpenXML中的CellValues.InlineString和CellValues.String有什么区别?

我正在尝试编写一些代码来生成Excel电子表格,我不确定CellValues.InlineStringCellValues.String在单元格上插入文本有什么区别.

我要用这个:

private void UpdateCellTextValue(Cell cell,string cellValue)
{
    InlineString inlineString = new InlineString();
    Text cellValueText = new Text { Text = cellValue };
    inlineString.AppendChild(cellValueText);

    cell.DataType = CellValues.InlineString;
    cell.AppendChild(inlineString); 
}
Run Code Online (Sandbox Code Playgroud)

这个

private void UpdateCellTextValue(Cell cell, string cellValue)
{
    cell.CellValue = new CellValue(cellValue);
    cell.DataType = new EnumValue<CellValues>(CellValues.String);
}
Run Code Online (Sandbox Code Playgroud)

或者只是这个(InsertSharedStringItem返回新插入的共享字符串项的Id)

private void SetCellSharedTextValue(Cell cell,string cellValue)
{        
    int stringId = InsertSharedStringItem(cellValue);
    cell.CellValue = new CellValue(stringId.ToString());
    cell.DataType = new EnumValue<CellValues>(CellValues.SharedString);
}
Run Code Online (Sandbox Code Playgroud)

c# openxml openxml-sdk

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

服务定位器比依赖注入更容易使用?

我正在处理的应用程序依赖于Autofac作为DI容器,其中一个原因让我决定使用它,其中包括委托工厂功能(见这里)

这适用于我需要多次重建相同元素的所有情况,如某些报告和相关屏幕的情况.一些报告(甚至那些相同类型的报告)是同时执行的,但它们仅通过用户定义的参数进行更改,因此注入工厂以创建实例,传递免费参数并将其余参数留给应用.

问题在于每个报告由可变数量的子报告(任务)组成,每个任务都实现ITask接口.每个报告最多可以使用50个不同的任务,每个任务都包含一个精确的业务操作.我有一个选择是注入委托工厂并在需要时创建它们.

这些任务必须由工厂动态生成,例如:

var myTaskA = _taskFactoryConcreteTaskA();
var myTaskB = _taskFactoryConcreteTaskB();
var myTaskC = _taskFactoryConcreteTaskC();
...
var myTaskZZ = = _taskFactoryConcreteTaskZZ();
Run Code Online (Sandbox Code Playgroud)

需要大量的手动布线(代表,构造函数,支持领域等)

var myTaskA = _taskFactory.Create<ConcreteTaskA>();
var myTaskB = _taskFactory.Create<ConcreteTaskB>();
var myTaskC = _taskFactory.Create<ConcreteTaskC>();
...
var myTaskZZ = _taskFactory.Create<ConcreteTaskZZ>();
Run Code Online (Sandbox Code Playgroud)

如果_taskFactory包装容器正如一篇文章中所示,将是非常少的工作,但它也基本上意味着我使用服务定位器来创建我的任务.

我还有哪些其他选择可能适合解决这个问题?

(注意:我很有可能完全偏离轨道,我必须阅读更多有关DI的内容,在这种情况下,任何贡献都会更加重要)

c# dependency-injection ioc-container autofac

6
推荐指数
2
解决办法
597
查看次数

WPF Datagrid:将其他行复制到剪贴板

我正在使用WPF Datagrid,我正在尝试增强/更改复制和粘贴机制.

当用户选择一些单元格然后按CTRL + C时,底层控件能够捕获CopyingRowClipboardContent事件.

 this.mainDataGrid.CopyingRowClipboardContent 
              += this.DatagridOnCopyingRowClipboardContent;
Run Code Online (Sandbox Code Playgroud)

在这种方法中,一些单元格被添加到标题和行中,因此产生"更宽"的网格.

    private void DatagridOnCopyingRowClipboardContent(
        object sender, 
        DataGridRowClipboardEventArgs dataGridRowClipboardEventArgs)
    {
        // this is fired every time a row is copied
        var allContent = dataGridRowClipboardEventArgs.ClipboardRowContent;

        allContent.Insert(0, new DataGridClipboardCellContent(
                                            null, 
                                            this.mainDataGrid.Columns[0], 
                                            "new cell"));
    }
Run Code Online (Sandbox Code Playgroud)

此时我被卡住了,因为我试图在标题之前添加一行,在最后一行之后添加行(见下图).

有任何想法吗?建议?

请注意我对MVVM的方式不感兴趣.

在此输入图像描述

wpf clipboard datagrid

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

CQRS和计算

我目前正在研究一些遵循CQRS模式的概念验证代码,我无法找到一个令人满意的解决方案来解决我认为的问题.

系统根据特定情景计算市场变化对给定投资组合的影响.

投资组合可以包含一到几百个馆藏,并且市场场景是由用户针对特定请求在运行中预先定义或定义的.

在最简单的形式中,该问题的解决方案是在给定输入的情况下返回一些值的服务,但在CQRS情况下,在我看来,执行计算的部分(域)不应该被实际返回的部分调用数据(查询).

考虑到像这样的系统很容易有几个投资组合,并且场景的数量也可能很高,我认为存储计算结果并不合理.

任何人都有这个问题的解决方案,或者可以指向一个解决类似问题的文章的方向?

architecture cqrs

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

Microsoft.VisualBasic.DateAndTime到C#

我有一组严重依赖于它的vb.net类和函数

DateAndTime 
Run Code Online (Sandbox Code Playgroud)

可以在

Microsoft.VisualBasic 
Run Code Online (Sandbox Code Playgroud)

命名空间.

任何人都知道某个地方是否存在属性或方法的"转换表"(似乎SO没有)?

我肯定希望避免引用VisualBasic.dll或启动试验和错误过程来确定转换,如果这些已经在某处完成.

谢谢!

c# vb.net vb.net-to-c#

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

无法从Func <T>分配给Func <Interface>

如果我有

public class MyClass
{
    public Func<IModel> InputFunc { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

并尝试做

public void SetInput<TInput>(Func<TInput> funcInput) where TInput:IModel
{
   ...
   var c = new MyClass();
   c.InputFunc = funcInput;
   ...
}
Run Code Online (Sandbox Code Playgroud)

我收到编译错误

 Cannot implicitly convert type 'System.Func<TInput>' to 'System.Func<IModel>'
Run Code Online (Sandbox Code Playgroud)

这是为什么造成的?我怎样才能克服这个问题?(我尝试了where子句但没有帮助)

c# generics lambda

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

流畅的接口:避免泛型类型上的过多参数

我正在设计一组通用接口,以澄清一些报告的构造.

为了达到这个目的,我使用泛型,我必须在不同的流畅类之间传递三个通用参数.有时我必须通过其中的四个,但这一切都是由框架完成的,背后的想法是,只要有足够的注意力,就可以拥有一个完整的界面而无需输入任何泛型.

一个例子是

        t1.Schedule.ForSession(Session).
            WithName("TestName").
            Map.
            Args.FromResultsOfTask(t2).UsingDefaultMappings().
            And.
            WaitOnCompletionOfTask(t4);
Run Code Online (Sandbox Code Playgroud)

运行FXCop产生了这种类型的无限抱怨:

Error, Certainty 85, for AvoidExcessiveParametersOnGenericTypes
Run Code Online (Sandbox Code Playgroud)

我正在使用泛型来创建"类型安全"(也许类型感知更正确)接口,其中映射可以定义为

...
Map.Args.From(myObject).
    Mapping(x=>x.MyProperty).To(y=>y.ArgsProperty).
...
Run Code Online (Sandbox Code Playgroud)

我可以采用哪些策略来减少泛型的使用并仍然实现编译安全的自定义映射?

有没有人成功地使用泛型(并且可以指出一组很好的例子)来实现流畅的界面?

c# generics fluent-interface

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