我正在尝试使用xUnit.net进行单元测试.我想用'[InlineData]'进行'理论'测试,其中包括'小数':
[Theory]
[InlineData(37.60M)]
public void MyDecimalTest(decimal number)
{
Assert.Equal(number, 37.60M);
}
Run Code Online (Sandbox Code Playgroud)
这是不可能的,因为您不能将小数创建为常量.我找到了解决方法,把数引号 LIK如此__CODE__.这实际上会将其转换为双重,这将使测试失败.
问题:
有解决方法吗?如果不是,为我的测试创建多个测试用例的最简单方法是什么?
简而言之:
在某些情况下,设置Slider.Minimum会调整Slider.Value,尽管当前值大于新的最小值.
代码:(应该是可重现的)
MainWindow.xaml:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<DockPanel>
<Slider Name="MySlider" DockPanel.Dock="Top" AutoToolTipPlacement="BottomRight" />
<Button Name="MyButton1" DockPanel.Dock="Top" Content="shrink borders"/>
<Button Name="MyButton2" DockPanel.Dock="Top" VerticalAlignment="Top" Content="grow borders"/>
</DockPanel>
</Window>
Run Code Online (Sandbox Code Playgroud)
MainWindow.xaml.cs:
using System.Windows;
using System.Windows.Controls;
namespace WpfApplication1
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
MySlider.ValueChanged += (sender, e) =>
{
System.Diagnostics.Debug.WriteLine("Value changed: " + e.NewValue);
};
System.ComponentModel.DependencyPropertyDescriptor.FromProperty(Slider.MinimumProperty, typeof(Slider)).AddValueChanged(MySlider, delegate
{
System.Diagnostics.Debug.WriteLine("Minimum changed: " + MySlider.Minimum);
});
System.ComponentModel.DependencyPropertyDescriptor.FromProperty(Slider.MaximumProperty, typeof(Slider)).AddValueChanged(MySlider, delegate
{
System.Diagnostics.Debug.WriteLine("Maximum changed: " + …Run Code Online (Sandbox Code Playgroud) 一个非常常见的实现RelayCommand似乎包括以下几行:
public event EventHandler CanExecuteChanged
{
add
{
CommandManager.RequerySuggested += value;
}
remove
{
CommandManager.RequerySuggested -= value;
}
}
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎非常有缺陷,因为它CommandManager是一个WPF组件,通常我的命令位于viewmodel类中.由于viewmodel不应该知道视图并且应该使用不同的框架等,这对我来说似乎很奇怪.例如,如果将viewmodel分离到一个不知道WPF名称空间(例如PCL)的额外项目中,则甚至不可能实现此实现.
此实现是否违反了MVVM模式?
或者您可能会RelayCommand以某种方式放置在您的视图中?
如果确实存在缺陷,是否有解决此问题的最佳实践实施?
我的Windows设置被设置为DPI为96.但是,当我创建以下内容时Window,它将比我的屏幕(设置为1920*1080分辨率)小一点:
<Window x:Class="WPF_Sandbox.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WPF_Sandbox"
mc:Ignorable="d"
Title="MainWindow"
Width="1920">
</Window>
Run Code Online (Sandbox Code Playgroud)
根据这篇 msdn博客文章:
1个设备独立像素= 1/96英寸.
1个物理像素= 1/DPI(取决于系统DPI)默认系统设置通常选择DPI为96,因此这两种像素的大小相同.
然而,这似乎并非如此,因为我Window显然不到1920像素宽.
如果我最大化Window并检查ActualWidth它似乎是1936.
为什么会这样?
TargetNullValue应该Target在绑定Source评估时更新绑定null:
获取或设置当源的值为null时在目标中使用的值.
除此之外,当值等于给定时,它似乎也设置Source为null(如果可能的话).换句话说,它有效地建立了与财产价值之间的等价关系.但是文档中根本没有提到这一点.TargetTargetNullValuenullTargetNullValue
看这个例子:
<Window x:Class="WPF_Sandbox.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WPF_Sandbox"
Title="MainWindow"
x:Name="ThisControl">
<StackPanel x:Name="MainStackPanel">
<TextBox x:Name="MyTextBox" Text="{Binding NullableInt, ElementName=ThisControl, TargetNullValue='', UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>
</Window>
public partial class MainWindow : Window
{
private int? nullableInt;
public int? NullableInt
{
get { return nullableInt; }
set { nullableInt = value; }
}
public MainWindow()
{
InitializeComponent();
}
}
Run Code Online (Sandbox Code Playgroud)
注意:UpdateSourcetrigger仅设置为使测试更容易,并且与所讨论的效果无关.
如果你在NullableIntsetter中放置一个断点,你可以看到value == null …
通过在C#7.0中引入ValueTuples,我们现在可以拥有多个返回值:
public (int sum, int count) GetTallies()
{
return (1, 2);
}
Run Code Online (Sandbox Code Playgroud)
我的印象是,out参数的唯一原因是提供一种限制只有一个返回值的解决方法。但是,out参数也得到了改进,这告诉我C#设计人员认为它们不会过时。
我是否缺少某些东西,或者是out var declaration为了简化旧库的使用而引入公正的原因?
为了进一步阐明这个问题:我可以做什么out,我不能做ValueTuples什么?
dotPeek是免费的.NET反编译器。作为独立工具时,它也是ReSharper的一部分:如果告诉ReSharper导航到class.dll文件中的定义,它将自动反编译该文件并向您提供源代码。
我不想使用ReSharper。没有ReSharper可以得到相同或相似的功能吗?这是仅ReSharper的功能吗?
为什么以下代码会产生错误?
var listOfList = new List<List<string>>();
var tmp = listOfList.Select(x => x.OrderBy(y => y).Cast<x.GetType()>());
Run Code Online (Sandbox Code Playgroud)
错误:
运算符'<'不能应用于'方法组'和'System.Type'类型的操作数
代码看起来很愚蠢,因为它从我的真实例子中极度简化.我只是想知道为什么它不能正常工作.如果我替换x.getType()为List<string>,它可以工作,但我现在不在运行时使用x的类型.
澄清一下:我没有必要寻找解决方案.我想知道我的代码到底出了什么问题.
当我IsClosed在运行时设置值时,OnIsClosedChanged()称为罚款.但是,Designer会设置属性的值,但不会调用OnIsClosedChanged().
public static DependencyProperty IsClosedProperty = DependencyProperty.Register("IsClosed", typeof(bool), typeof(GroupBox), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender));
public bool IsClosed {
get {
return (bool)this.GetValue(IsClosedProperty);
}
set {
if ((bool)this.GetValue(IsClosedProperty) == value)
return;
this.SetValue(IsClosedProperty, value);
OnIsClosedChanged();
}
}
private void OnIsClosedChanged() {
_rowDefContent.Height = new GridLength((IsClosed ? 0 : 1), GridUnitType.Star);
}
Run Code Online (Sandbox Code Playgroud)
显然IsClosed,Designer不会对其进行修改,只会IsClosedProperty接收xaml更改.
我的问题是:如何IsClosed在Designer中修改了值后运行.或者至少为非运行时更改添加一些逻辑.
我有一个IGrouping类型的对象,并希望在不改变对象类型的情况下对组内的元素进行排序.
换句话说,我有
var tmp = group.OrderBy(x => x);
Run Code Online (Sandbox Code Playgroud)
同group是型的IGrouping<int, someanonymousclass>,我想tmp为类型IGrouping<int, someanonymousclass>为好.
一种解决方法是将其更改为Dictionary或新的匿名类,但我希望tmp特别是类型IGrouping<int, someanonymousclass>.
换句话说:我想对我IGrouping<int, someanonymousclass>对象的元素进行排序.如果我使用OrderBy它改变的类型group来IOrderedEnumerable和我不能访问group.Key了.我怎么能维持这种类型group?
例:
var states = SimulationPanel.innerPanel.Children.OfType<StateBar>().Where(x => x.isSensorState())
.GroupBy(x => (SensorElement)x.BauplanElement,
x => new
{
Start = (decimal)(x.Margin.Left / SimulationPanel.Zoom),
Width = (decimal)(x.Width / SimulationPanel.Zoom),
State = x.State
});
var group = states.First();
var tmp = group.OrderBy(x => x.Start);
var key = tmp.Key; //This …Run Code Online (Sandbox Code Playgroud) 我有一个类型的表达式Expression<Func<TElement, TElement, bool>>和一个类型的常量TElement。我需要一个类型的表达式Expression<Func<TElement, bool>>,其中一个参数被常量替换。换句话说,我需要以下方法的主体:
public static Expression<Func<TElement, bool>> ReplaceParameter<TElement>
(
Expression<Func<TElement, TElement, bool>> inputExpression,
TElement element
)
{
...
}
Run Code Online (Sandbox Code Playgroud)
如果我打电话ReplaceParameter((i1, i2) => i1 > i2, 5),我预计结果是i => i > 5。
我在想,它也许能够递归地解构然后重建输入表达式,并用常量表达式替换所有出现的第二个参数。由于有很多不同的表达方式,我不确定如何做到这一点。
我想将 a 的值更改为Slider鼠标滚轮:当我向上滚动时,Slider's Value属性应该增加,当我向下滚动时,它应该减少。
该行为应该独立于鼠标位置或当前焦点。
解决方案最好使用绑定并且仅是 XAML,但代码隐藏解决方案也足够了。
c# ×10
wpf ×6
.net ×3
linq ×2
slider ×2
c#-7.0 ×1
casting ×1
data-binding ×1
decimal ×1
decompiling ×1
dotpeek ×1
dpi ×1
expression ×1
icommand ×1
igrouping ×1
mousewheel ×1
mvvm ×1
nullable ×1
out ×1
reflection ×1
relaycommand ×1
resharper ×1
select ×1
sql-order-by ×1
tuples ×1
typeof ×1
xaml ×1
xunit.net ×1