小编Not*_*sxl的帖子

XML单元测试:.NET的XmlUnit替代品?

我正在寻找XmlUnit替代品,因为:

你如何测试你的xml序列化/反序列化?

PS:更多细节:

  • 我正在使用NUnit
  • 我坚持使用.NET 2

.net xml unit-testing

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

NHibernate:在提交事务之前调用Session.Flush()是否有效?

我需要在NHibernate的工作单元中执行两个操作:事务性(实体保存)和非事务性操作.

由于无事务操作无法回滚,如果我执行非事务操作(并最终提交事务)之前保存实体,我仍然会得到一个事务行为:

  • 仅当两个子操作成功执行时,才会提交操作;
  • 如果实体保存失败,则不执行非事务操作;
  • 如果非事务性失败,则实体保存将被回滚.

问题:使用如下代码,NHibernate将不会执行实际的sql插入,直到调用transaction.Commit()(在内部调用session.Flush()):

        using (var transaction = session.BeginTransaction())
        {
            session.Save(entity);
            NotTransactionalOperationBasedOn(entity);

            transaction.Commit(); // the actual sql insert will be executed here
        }
Run Code Online (Sandbox Code Playgroud)

使用这样的代码,如果Sql Insert失败则为时已晚:NotTransactionalOperation已执行.要在执行NotTransactionalOperation之前执行实际的SQL插入,我必须在session.Save()之前明确调用session.Flush():

        using (var transaction = session.BeginTransaction())
        {
            session.Save(entity);
            session.Flush(); // the actual sql insert will be executed here

            NotTransactionalOperationBasedOn(entity);

            transaction.Commit(); 
        }
Run Code Online (Sandbox Code Playgroud)

代码有效,但......在提交事务之前调用session.Flush()是最佳做法吗?如果没有,是否有更好的方法来实现相同的结果?

.net c# nhibernate transactions flush

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

DataGridViewCheckBoxColumn:如何在属性更改而不是验证时更新绑定的DataSource

我有一个绑定的BindingList作为DataGridView的数据源; 其中一个TSource属性绑定到DataGridViewCheckBoxColumn,但数据源不会在单击复选框时更新,而是在复选框本身的焦点丢失时更新.

我知道当DataSourceUpdateMode是"OnValidation"而不是"OnPropertyChanged"时,标准的WindowsForms绑定会发生类似的事情,但是如何使用DataGridViewCheckBoxColumn获得相同的结果呢?

该列定义如下:

            DataGridViewCheckBoxColumn column = new DataGridViewCheckBoxColumn();
            column.DataPropertyName = "MyProperty";
            column.HeaderText = "Title";

            dataGridView.Columns.Add(column);
Run Code Online (Sandbox Code Playgroud)

binding datagridview datagridviewcolumn winforms

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

IEqualityComparer <double>具有容差; 如何实现GetHashCode?

我正在实现一个可重用的DoubleEqualityComparer(具有自定义容差:"epsilon"构造函数参数),以简化LINQ的使用,使用double序列.例如:

bool myDoubleFound = doubles.Contains(myDouble, new DoubleEqualityComparer(epsilon: 0.01));
Run Code Online (Sandbox Code Playgroud)

实现GetHashCode的正确方法是什么?这是代码:

   public class DoubleEqualityComparer : IEqualityComparer<double>, IEqualityComparer<double?>
    {
        private readonly double epsilon;

        public DoubleEqualityComparer(double epsilon)
        {
            if (epsilon < 0)
            {
                throw new ArgumentException("epsilon can't be negative", "epsilon");
            }

            this.epsilon = epsilon;
        }

        public bool Equals(double x, double y)
        {
            return System.Math.Abs(x - y) < this.epsilon;
        }

        public int GetHashCode(double obj)
        {
            // ?
        }
   }
Run Code Online (Sandbox Code Playgroud)

PS:我总是可以返回相同的值(例如:GetHashCode(double obj){return 0;})以始终强制调用Equals(double,double)方法(不是很高效,我知道),但我记得这个当比较器与字典一起使用时,解决方案会导致问题...

.net double hashcode epsilon iequalitycomparer

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

Rx框架:在超时时执行操作,而不会中断原始的可观察序列

给定一个可观察的源,通过轮询低级设备的状态(a的变化)生成...

// observable source metacode:
IObservable<DeviceState> source = Observable.Interval(TimeSpan.FromSeconds(0.5))
    .Select(tick => new DeviceState(_device.ReadValue()))
    .DistinctUntilChanged();
Run Code Online (Sandbox Code Playgroud)

......以及更新UI的消费者......

// UI metacode:
service.GetObservableDeviceStates()
    .Subscribe(state => viewModel.CurrentState = state.ToString());
Run Code Online (Sandbox Code Playgroud)

...我需要在x秒的源"不活动"之后执行自定义操作,而不会中断对源的订阅.像这样的东西:

// UI metacode:
service.GetObservableDeviceStates()
    .DoOnTimeout(TimeSpan.FromSeconds(x), () => viewModel.CurrentState = "Idle")
    .Subscribe(state => viewModel.CurrentState = state.ToString());
Run Code Online (Sandbox Code Playgroud)

什么是最佳做法?想到的可能解决方案是(我是Rx noob):

  1. 缓冲区(即使它不那么可读)
  2. 这个超时超载 ;
  3. 当没有任何变化(而不是使用DistinctUntilChanged)并在UI代码上处理它时,返回一些特殊的"服务端":

    service.GetObservableDeviceStates().Subscribe(state => viewModel.CurrentState = state.Special?"Idle":state.ToString());

编辑:如答案中所述,解决方案是:

        service.GetObservableDeviceStates()
            .Do(onNext)
            .Throttle(TimeSpan.FromSeconds(x))
            .Subscribe(onTimeout);
Run Code Online (Sandbox Code Playgroud)

EDIT2(警告)

如果onNext和onTimeout更新UI组件,为了避免CrossThreadExceptions需要两个 ObserveOn(uiSynchronizationContext),因为Throttle在另一个线程上工作!

        service.GetObservableDeviceStates()
            .ObserveOn(uiSynchronizationContext)
            .Do(onNext)
            .Throttle(TimeSpan.FromSeconds(x))
            .ObserveOn(uiSynchronizationContext)
            .Subscribe(onTimeout);
Run Code Online (Sandbox Code Playgroud)

c# timeout system.reactive

7
推荐指数
2
解决办法
1993
查看次数

Marshal :: GetFunctionPointerForDelegate:我应该发布它的结果吗?

我正在将一个托管的System.Action转换为C++/CLI项目中的非托管std :: function; 我应该在使用回调后释放给定的IntPtr,还是不必要?

void MyClass::Execute(System::Action^ callback)
{           

    IntPtr callbackPtr = Marshal::GetFunctionPointerForDelegate(callback);
    std::function<void (void)> nativeCallback = static_cast<void (__stdcall *) (void)>(callbackPtr.ToPointer());

    m_nativeObject->Execute(wrappedCallback);

    // should I release callbackPtr here?
}
Run Code Online (Sandbox Code Playgroud)

c# lambda c++-cli std-function

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

访问者模式是将域枚举重构为类的最佳方式吗?

如果我们想要将枚举(包含在域层中)重构为多态类,那么使用"简单"抽象方法可能是一个坏主意,如果我们要重构的所有switch和if语句都在其他层内(如业务或表示层),因为我们最终可能会在域层内引用这些层:

public abstract class MyRefactoredEnum
{
    public abstract void DoSomething(IBusinnessObject aBizObject); //dependency to the biz. layer

    public abstract MvcHtmlString GetImgTag(); //dependency to presentation layer
}
Run Code Online (Sandbox Code Playgroud)

(在上面的例子中,我们也可以有一个"交叉引用"问题)

我发现访问者模式(http://en.wikipedia.org/wiki/Visitor_pattern)是这个问题的有效解决方案:在域层我们只定义了MyRefactoredEnum.IVisitor接口,所有其他层都可以实施自己的访客.

唯一的问题是:当我们修改MyRefactoredEnum.IVisitor接口时(例如,因为我们添加了另一个MyRefactoredEnum的子类),我们必须修改并重新编译引用域模型的所有项目和解决方案.我们可以使用反射来解决问题(http://surguy.net/articles/visitor-with-reflection.xml),但它可能很慢......

重构枚举是否有更好的模式?

PS:对不起我糟糕的英语:)

c# polymorphism enums design-patterns visitor-pattern

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

C++/CLI:如何在本机类中存储托管引用?

在我的混合解决方案(C++/.NET)中,我想将Log4Net的ILog实例传递给C++对象(统一解决方案中的日志记录).

我想写一个C++接口(LogInterface),然后在C++/CLI项目中实现托管到非托管的适配器,但问题是非托管适配器将无法存储指向托管ILog的字段实例.

是否有一种优雅,安全且有效的方法来实现这一点(除了将托管引用存储在静态缓存中)?

class UnmanagedLogAdapter : 
    public LogInterface
{
    public:
        UnmanagedLogAdapter(log4net::ILog^ log);

        virtual bool IsInfoEnabled(void) const override
        {
            return m_log->IsInfoEnabled();
        }

        virtual void Info(const std::wstring& message) override
        {
            log4net::ILog^ log = m_log; // alternative that I want to avoid: log = StaticCache::Find(m_logId);
            log->Info(gcnew System::String(message.cstr()));
        }

    private:
        log4net::ILog^ m_log; //TODO: a managed field is forbidden
};
Run Code Online (Sandbox Code Playgroud)

.net c++ logging log4net c++-cli

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

Windows 窗体绑定:是否有类似于 DataBindingComplete 的事件,但在所有绑定完成时触发?

只有在完成所有初始数据绑定后,我才需要更改某个 DataGridView 的属性(其绑定之一的 DataSourceUpdateMode)。

我尝试订阅“DataBindingComplete”事件,但它触发了太多次(对于与控件关联的每个绑定一次或多次);我需要的是一个更全局的“AllDataBindingsComplete”事件,当控件准备好向用户显示时触发。

作为临时解决方法,我正在使用 MouseDown 事件(我假设当用户能够单击控件时,这意味着控件被显示...... :) 以及我正在玩的事件 - SelectionChanged - 在 MouseDown 之后触发):

    protected override void OnMouseDown(MouseEventArgs e)
    {
        Binding selectedItemsBinding = this.DataBindings["SelectedItems"];
        if (selectedItemsBinding != null)
        {
            selectedItemsBinding.DataSourceUpdateMode = DataSourceUpdateMode.OnPropertyChanged;
        }

        base.OnMouseDown(e);
    }
Run Code Online (Sandbox Code Playgroud)

它有效,但它闻起来像一个丑陋的黑客很多(而且它被调用了太多次,只有一次就足以满足我的需要)。

有没有更好的办法?

(是的,我正在尝试在 Windows 窗体项目中采用 MVVM,并且我已经向 DataGridView 添加了一个可绑定的“SelectedItems”属性...)

c# data-binding events mvvm winforms

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