小编Tho*_*que的帖子

我可以使用System.Linq.Expressions动态生成异步方法吗?

我知道编译器无法将异步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)

我找不到相关的任何方法asyncawaitExpression类,但也许有另一种方式?

c# linq code-generation expression-trees async-await

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

使用ODP.NET按名称绑定查询参数

我目前正在使用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时,参数按名称绑定,这就是我想要的.不幸的是,这对我没有帮助,因为:

  • 默认设置为false
  • 我几乎从来不使用混凝土ADO.NET类明确,我更喜欢使用ADO.NET 2.0抽象层(DbProviderFactory,DbConnection,DbCommand...),以减少连接到任何特定的RDBMS.所以我没有访问该BindByName属性,除非我明确地转换OracleCommand,失去所有的好处或抽象.
  • 当使用ASP.NET SqlDataSource时,我自己不创建DbCommand,所以我没有机会设置BindByName为true(我可以在Selecting事件中做到这一点,但是对于每个事件来说真的很难SqlDataSource的...)

我该如何处理这个问题?BindByNameByDefault某处有设置吗?(我没有找到类似的东西,但我可能错过了......)

c# oracle ado.net odp.net

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

Enumerable.Cast <T>扩展方法无法从int转换为long,为什么?

可能重复:
令人困惑的Enumerable.Cast InvalidCastException

嗨,

我只是注意到Enumerable.Cast<T>扩展方法有些奇怪......似乎它无法转换intlong,即使这个演员是完全合法的.

以下代码失败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无法解释迭代器块,所以很难理解......

c# linq casting

17
推荐指数
2
解决办法
7058
查看次数

如何在XAML ResourceDictionary中声明一个空字符串

我有一个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:Staticsys:String元素给出了同样的错误了.

甚至可以将空字符串声明为XAML资源吗?怎么样?

string wpf resources xaml

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

定时器,事件和垃圾收集:我错过了什么?

请考虑以下代码:

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:当然,这不是一个真正的程序,我只是想向别人证明一点...但我的证据不起作用;)

.net c# garbage-collection timer

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

绑定到wpf中父元素的属性

'我想将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)

...

wpf bind element properties parent

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

如何访问嵌套类的私有成员?

背景:我已经使用嵌套类N封装了(父)类E,在E中有几个N实例.在封闭的(父)类中,我正在进行一些计算,我正在为嵌套类的每个实例设置值.像这样的东西:

n1.field1 = ...;
n1.field2 = ...;
n1.field3 = ...;
n2.field1 = ...;
...
Run Code Online (Sandbox Code Playgroud)

它是一个大的eval方法(在父类中).我的意图是 - 因为所有计算都在父类中(它们不能按照嵌套实例进行,因为它会使代码更复杂) - 使setter仅对父类和getter公共可用.

现在有一个问题:

  • 当我将setter设为私有时,父类无法访问它们
  • 当我公开它们时,每个人都可以改变价值观
  • 和C#没有朋友的概念
  • 我无法在构造函数中传递值,因为使用了惰性求值机制(因此必须在引用它们时创建实例 - 我创建所有对象并按需触发计算)

我被困 - 怎么做(限制访问父类,不多也不少)?


我怀疑我会先回答问题 - "但是为什么你不按每个字段拆分评估" - 所以我通过例子回答这个问题:你如何计算集合的最小值和最大值?快点?答案是 - 一次通过.这就是为什么我有一个eval函数可以进行计算并一次设置所有字段.

c# design-patterns

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

我可以强制编译器优化特定方法吗?

是否有一个属性可以告诉编译器必须始终优化方法,即使/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)

c# compiler-construction optimization il

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

如何选择并滚动到Datagridview中的新行?

我有一个绑定到数据库表的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)

我需要的是:

  • datagridview应滚动到底部(newRow所在的位置)
  • 应该关注newRow,以便textfields显示新的(空)行(内容)

我试过了:

        bindSourceGS.Position = dataGridView1.NewRowIndex;
Run Code Online (Sandbox Code Playgroud)

但是这并没有选择datagridview的newRow.我想使用datagridview的newRow,因为当用户按下取消按钮时,我不必删除数据集中的行,而datagridview.Rows [i]有一个IsNewRow属性.

.net datagridview

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

迭代器块的奇怪测试覆盖率结果,为什么这些语句没有被执行?

我正在使用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# unit-testing iterator code-coverage dotcover

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