Tag: lambda

如何让孩子从表达式中声明类型?

我有一个Parent / Child类层次结构,其中Parent抽象地声明了一个字符串属性,而Child类实现了它: abstract class Parent { public abstract string Value { get; } } class Child : Parent { public override string Value { get { return null; } } } 当我使用显式(或隐式)使用Child类的表达式时,我希望Expressions的MemberInfo的DeclaringType为’Child’,但它是Parent: Child child = new Child(); Expression<Func> expression = (() => child.Value); MemberInfo memberInfo = expression.GetMemberInfo(); Assert.AreEqual(typeof(Child), memberInfo.DeclaringType); // FAILS! 断言失败,因为DeclaringType是Parent。 在声明我的表达或使用它来揭示Child类型的实际用途时,我能做些什么吗? 注意:上面的GetMemberInfo()作为扩展方法(我甚至忘记了我们写过这个!): […]

C#lambda表达式是否会返回void?

我有以下方法, 我想知道下面是否有任何东西可以使用default(void),因为有一个编译器错误,说明void在这里无效: private void applyDefaultsIfNecessary(ApplicationConfiguration configuration) { var defaults = new Dictionary<Predicate, Action>() { // { rule, action } – if rule is true, execute action { (c) => c.ConnectionString == null , (c) => c.ConnectionString = “foo” }, { (c) => c.OutputExcelFilePath == null, (c) => c.ConnectionString = “bar” }, { (c) => c.OutputDirectory […]

捕获异步回调中抛出的exception

我有一个方法,它采用一个回调参数异步执行,但catch块似乎没有捕获同步调用抛出的任何exception( this.Submit引用同步方法)。 public void Submit(FileInfo file, AnswerHandler callback) { SubmitFileDelegate submitDelegate = new SubmitFileDelegate(this.Submit); submitDelegate.BeginInvoke(file, (IAsyncResult ar) => { string result = submitDelegate.EndInvoke(ar); callback(result); }, null); } 有没有办法捕获新线程抛出的exception并将其发送到原始线程? 另外,这是处理异步exception的“正确”方法吗? 我编写了我的代码,因此可以像这样调用(假设exception问题已修复): try { target.Submit(file, (response) => { // do stuff }); } catch (Exception ex) { // catch stuff } 但有没有更合适或更优雅的方式来做到这一点?

混淆`Action`委托和lambda表达式

private void StringAction(string aString) // method to be called { return; } private void TestDelegateStatement1() // doesn’t work { var stringAction = new System.Action(StringAction(“a string”)); // Error: “Method expected” } private void TestDelegateStatement2() // doesn’t work { var stringAction = new System.Action(param => StringAction(“a string”)); // Error: “System.Argument doesn’t take 1 arguments” stringAction(); } private […]

Null-coalescing运算符和lambda表达式

看看我试图在构造函数中编写的以下代码: private Predicate _isValid; //… Predicate isValid = //…; this._isValid = isValid ?? s => true; 代码无法编译 – 只是“无效的表达式术语”等等。 相比之下,编译,我可以使用它: this._isValid = isValid ?? new Predicate(s => true); 但是,我仍然想知道为什么不允许这种语法。 有任何想法吗?

委托中变量的范围

我发现以下内容相当奇怪。 然后,我主要使用动态语言中的闭包,这对于同一个“bug”不应该是可疑的。 以下使编译器不满意: VoidFunction t = delegate { int i = 0; }; int i = 1; 它说: 名为“i”的局部变量不能在此范围内声明,因为它会为“i”赋予不同的含义,“i”已在“子”范围中用于表示其他内容 所以这基本上意味着在委托中声明的变量将具有声明的函数的范围。不完全是我所期望的。 我甚至没有试过调用这个函数。 至少Common Lisp有一个function,你可以说变量应该有一个动态名称,如果你真的希望它是本地的。 这在创建不泄漏的宏时尤其重要,但这样的东西也会有所帮助。 所以我想知道其他人如何解决这个问题呢? 为了澄清我正在寻找一个解决方案,其中我在delegete中声明的变量不会干扰委托后声明的变量。 我仍然希望能够捕获委托之前声明的变量。

lambda表达式与方法组之间的区别

有什么区别 Class1.Method1(“cId”, Facade.Customers.GetSingle); 和 Class1.Method1(“cId”, x => Facade.Customers.GetSingle(x)); ? Resharper建议使用第一个表达式。

如何从C#中的字符串创建基于动态lambda的Linq表达式?

我在从字符串创建基于Lambda的Linq表达式时遇到一些困难。 以下是使用此示例对象/类的基本情况: public class MockClass { public string CreateBy { get; set; } } 基本上我需要转换这样的字符串: string stringToConvert = “x => x.CreateBy.Equals(filter.Value, StringComparison.OrdinalIgnoreCase”; 进入谓词/ linq表达式: System.Linq.Expressions.Expression<Func> or in this example System.Linq.Expressions.Expression<Func> 所以它相当于下面Where方法中的Linq表达式: query = query.Where(x => x.CreateBy.Equals(filter.Value, StringComparison.OrdinalIgnoreCase)); 我已经尝试过使用以下帮助程序,但似乎无法弄清楚如何让它们在这种情况下工作,我希望能够从字符串中提前建立一个linq表达式: http:http: //www.albahari.com/nutshell/predicatebuilder.aspx http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx (它现在作为NuGet包提供很好地称为“DynamicQuery”)

在定义后立即执行lambda表达式?

有没有办法在定义后立即执行lambda表达式? 换句话说(无效的C#代码): (() => { Console.WriteLine(“Hello World”); }).Invoke();

C#ToDictionary lambda选择索引和元素?

我有一个像string strn = “abcdefghjiklmnopqrstuvwxyz” ,想要一个字典,如: Dictionary(){ {‘a’,0}, {‘b’,1}, {‘c’,2}, … } 我一直在尝试这样的事情 strn.ToDictionary((x,i) => x,(x,i)=>i); …但是我一直在得到关于委托的各种错误,没有采用两个参数,以及未指明的参数等。 我究竟做错了什么? 我更喜欢对答案的提示,所以我对下次需要做的事情有一个精神上的痕迹,但根据Stackoverflow的性质,答案也很好。