我知道编译器无法将异步lambda表达式转换为表达式树,但是可以手动生成表达式树吗?
var expr = Expression.Lambda<Func<Task>>(
// how do I use 'await' in the body here?
);
var func = expr.Compile();
Run Code Online (Sandbox Code Playgroud)
我找不到相关的任何方法async或await在Expression类,但也许有另一种方式?
我目前正在使用Oracle(System.Data.OracleClient)的Microsoft ADO.NET提供程序.我知道它肯定不是最好的Oracle提供商,它很快就会被弃用,我应该使用Oracle的ODP.NET.我仍然使用MS提供程序的原因是因为ODP.NET按位置绑定参数,而不是按名称绑定.当您在查询中使用许多参数时,这实际上可能是PITA,因为您必须小心以正确的顺序添加它们,这很容易导致错误.在同一查询中多次使用相同参数时也很烦人,例如:
SELECT A,B,C FROM FOO WHERE X = :PARAM_X OR :PARAM_X = 0
Run Code Online (Sandbox Code Playgroud)
使用ODP.NET,我必须添加两个参数OracleCommand,我认为这是愚蠢的......
ODP.NET OracleCommand有一个属性来改变默认行为:BindByName.设置为true时,参数按名称绑定,这就是我想要的.不幸的是,这对我没有帮助,因为:
DbProviderFactory,DbConnection,DbCommand...),以减少连接到任何特定的RDBMS.所以我没有访问该BindByName属性,除非我明确地转换OracleCommand,失去所有的好处或抽象.BindByName为true(我可以在Selecting事件中做到这一点,但是对于每个事件来说真的很难SqlDataSource的...)我该如何处理这个问题?BindByNameByDefault某处有设置吗?(我没有找到类似的东西,但我可能错过了......)
嗨,
我只是注意到Enumerable.Cast<T>扩展方法有些奇怪......似乎它无法转换int为long,即使这个演员是完全合法的.
以下代码失败InvalidCastException:
foreach (var item in Enumerable.Range(0,10).Cast<long>())
{
Console.WriteLine(item);
}
Run Code Online (Sandbox Code Playgroud)
但是这个代码,我认为是相同的,确实有效:
foreach (var item in Enumerable.Range(0,10).Select(i => (long)i))
{
Console.WriteLine(item);
}
Run Code Online (Sandbox Code Playgroud)
谁能解释这种行为?我用Reflector查看了Cast方法的代码,但是Reflector无法解释迭代器块,所以很难理解......
我有一个ResourceDictionary包含字符串:
<ResourceDictionary xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:sys="clr-namespace:System;assembly=mscorlib">
<sys:String x:Key="Foo">Hello world</sys:String>
...
</ResourceDictionary>
Run Code Online (Sandbox Code Playgroud)
这个字典是主题的一部分,在某些主题中,一些字符串是空的:
<sys:String x:Key="Foo"></sys:String>
Run Code Online (Sandbox Code Playgroud)
麻烦的是,在这种情况下,我得到一个XamlParseException:
无法创建"System.String"类型的对象.CreateInstance失败,这可能是因为没有'System.String'的公共默认构造函数
我知道可以在数组资源中声明一个空字符串<x:Static Member="sys:String.Empty" />,但是我不想要一个数组...... x:Static直接使用作为资源返回标记扩展名,而不是字符串.把x:Static在sys:String元素给出了同样的错误了.
甚至可以将空字符串声明为XAML资源吗?怎么样?
请考虑以下代码:
class TestTimerGC : Form
{
public TestTimerGC()
{
Button btnGC = new Button();
btnGC.Text = "GC";
btnGC.Click += (sender, e) => GC.Collect();
this.Controls.Add(btnGC);
System.Windows.Forms.Timer tmr = new System.Windows.Forms.Timer();
tmr.Interval = 1000;
tmr.Tick += (sender, e) => this.Text = DateTime.Now.ToString();
tmr.Start();
}
}
Run Code Online (Sandbox Code Playgroud)
如果我没有弄错,在tmr变量超出范围之后,Timer就不会在任何地方引用它,因此它应该有资格进行垃圾收集.但是当我点击GC按钮时,计时器继续运行,所以我猜它没有被收集......
有没有人对此有解释?
PS:当然,这不是一个真正的程序,我只是想向别人证明一点...但我的证据不起作用;)
'我想将RichTextBox的Height属性绑定到GridView的Row的Height属性.我怎样才能做到这一点?我不知道如何获得Row的高度,因为我无法访问xaml中的Row,我想做什么.
Ancestor类型应该是GridViewHeaderRow,但我不知道它的级别......
编辑:
<my:RadGridView Height="524" RowHeight="300" ItemsSource="{Binding Lessons}" AutoGenerateColumns="False" Name="dataGrid1" VerticalAlignment="Top" SelectionMode="Single" CanUserSortColumns="False" IsFilteringAllowed="False">
<my:RadGridView.Columns>
<my:GridViewDataColumn DataMemberBinding="{Binding SchoolclassName}" Header="Schoolclass" Width="0.1*" />
<my:GridViewDataColumn DataMemberBinding="{Binding SubjectName}" Header="Subject" Width="0.1*" />
<my:GridViewDataColumn Width="0.3*" Header="Homework">
<my:GridViewDataColumn.CellTemplate>
<DataTemplate>
<RichTextBox Height="{Binding ElementName=dataGrid1,Path=RowHeight}" >
<FlowDocument>
<Paragraph>
<Run Text="{Binding Homework}"/>
</Paragraph>
</FlowDocument>
</RichTextBox>
</DataTemplate>
</my:GridViewDataColumn.CellTemplate>
<my:RadGridView Height="524" ItemsSource="{Binding Lessons}" AutoGenerateColumns="False" Name="dataGrid1" VerticalAlignment="Top" SelectionMode="Single" CanUserSortColumns="False" IsFilteringAllowed="False">
<my:RadGridView.Columns>
<my:GridViewDataColumn Name="ContentColumn" Width="0.3*" Header="Content">
<my:GridViewDataColumn.CellTemplate>
<DataTemplate>
<RichTextBox Height="{Binding ElementName=MyRowNameToBindTo,Path=Height}">
<FlowDocument>
<Paragraph>
<Run Text="{Binding Content}"/>
</Paragraph>
</FlowDocument>
</RichTextBox>
</DataTemplate>
</my:GridViewDataColumn.CellTemplate>
Run Code Online (Sandbox Code Playgroud)
...
背景:我已经使用嵌套类N封装了(父)类E,在E中有几个N实例.在封闭的(父)类中,我正在进行一些计算,我正在为嵌套类的每个实例设置值.像这样的东西:
n1.field1 = ...;
n1.field2 = ...;
n1.field3 = ...;
n2.field1 = ...;
...
Run Code Online (Sandbox Code Playgroud)
它是一个大的eval方法(在父类中).我的意图是 - 因为所有计算都在父类中(它们不能按照嵌套实例进行,因为它会使代码更复杂) - 使setter仅对父类和getter公共可用.
现在有一个问题:
我被困 - 怎么做(限制访问父类,不多也不少)?
我怀疑我会先回答问题 - "但是为什么你不按每个字段拆分评估" - 所以我通过例子回答这个问题:你如何计算集合的最小值和最大值?快点?答案是 - 一次通过.这就是为什么我有一个eval函数可以进行计算并一次设置所有字段.
是否有一个属性可以告诉编译器必须始终优化方法,即使/o+未设置全局编译器开关?
我问的原因是因为我想要动态创建一个基于现有方法的IL代码的方法; 当代码被优化时,我想要做的操作相当容易,但由于编译器生成了额外的指令,因此在非优化代码中变得非常困难.
编辑:关于非优化的更多细节困扰我...
让我们考虑以下阶乘函数的实现:
static long FactorialRec(int n, long acc)
{
if (n == 0)
return acc;
return FactorialRec(n - 1, acc * n);
}
Run Code Online (Sandbox Code Playgroud)
(注意:我知道有更好的方法来计算阶乘,这只是一个例子)
在启用优化的情况下生成的IL非常简单:
IL_0000: ldarg.0
IL_0001: brtrue.s IL_0005
IL_0003: ldarg.1
IL_0004: ret
IL_0005: ldarg.0
IL_0006: ldc.i4.1
IL_0007: sub
IL_0008: ldarg.1
IL_0009: ldarg.0
IL_000A: conv.i8
IL_000B: mul
IL_000C: call UserQuery.FactorialRec
IL_0011: ret
Run Code Online (Sandbox Code Playgroud)
但是未经优化的版本是完全不同的
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldc.i4.0
IL_0003: ceq
IL_0005: ldc.i4.0
IL_0006: ceq
IL_0008: stloc.1
IL_0009: ldloc.1
IL_000A: brtrue.s IL_0010
IL_000C: ldarg.1 …Run Code Online (Sandbox Code Playgroud) 我有一个绑定到数据库表的DataGridView.DataGridView不可编辑,有一些文本字段可以编辑数据,这些字段由按钮控制.我有一个NewRow按钮,代码如下:
dataGridView1.AllowUserToAddRows = true;
foreach (DataGridViewRow row in dataGridView1.Rows)
{
if (row.Selected)
{ row.Selected = false; }
}
dataGridView1.Rows[dataGridView1.NewRowIndex].Selected = true;
Run Code Online (Sandbox Code Playgroud)
我需要的是:
我试过了:
bindSourceGS.Position = dataGridView1.NewRowIndex;
Run Code Online (Sandbox Code Playgroud)
但是这并没有选择datagridview的newRow.我想使用datagridview的newRow,因为当用户按下取消按钮时,我不必删除数据集中的行,而datagridview.Rows [i]有一个IsNewRow属性.
我正在使用dotCover来分析我的单元测试的代码覆盖率,并且我得到了一些奇怪的结果......我有一个迭代器方法,覆盖范围不完整,但是未涵盖的语句只是结束括号在方法的最后.
这是我正在测试的方法:
public static IEnumerable<T> CommonPrefix<T>(
this IEnumerable<T> source,
IEnumerable<T> other,
IEqualityComparer<T> comparer)
{
source.CheckArgumentNull("source");
other.CheckArgumentNull("other");
return source.CommonPrefixImpl(other, comparer);
}
private static IEnumerable<T> CommonPrefixImpl<T>(
this IEnumerable<T> source,
IEnumerable<T> other,
IEqualityComparer<T> comparer)
{
comparer = comparer ?? EqualityComparer<T>.Default;
using (IEnumerator<T> en1 = source.GetEnumerator(),
en2 = other.GetEnumerator())
{
while (en1.MoveNext() && en2.MoveNext())
{
if (comparer.Equals(en1.Current, en2.Current))
yield return en1.Current;
else
yield break;
}
} // not covered
} // not covered
Run Code Online (Sandbox Code Playgroud)
单元测试:
[Test]
public void Test_CommonPrefix_SpecificComparer()
{
var first = new[] { …Run Code Online (Sandbox Code Playgroud) c# ×7
.net ×2
linq ×2
wpf ×2
ado.net ×1
async-await ×1
bind ×1
casting ×1
datagridview ×1
dotcover ×1
element ×1
il ×1
iterator ×1
odp.net ×1
optimization ×1
oracle ×1
parent ×1
properties ×1
resources ×1
string ×1
timer ×1
unit-testing ×1
xaml ×1