标签: anonymous-methods

匿名方法强制转换为指针

有谁可以解释为什么下面的代码失败?

type TIDEThemeObserverFunc = reference to procedure(foo: integer);
var fObserverFuncs: TList<TIDEThemeObserverFunc>

function RegisterEventObserver(aObserverFunc: TIDEThemeObserverFunc): Pointer;
begin
  fObserverFuncs.Add(aObserverFunc);
  Result := @aObserverFunc;

  // line below somehow fails
  assert(fObserverFuncs.IndexOf(TIDEThemeObserverFunc(Result)) <> -1);
end;
Run Code Online (Sandbox Code Playgroud)

我假设匿名方法可以简单地通过指针进行转换和使用,但这似乎是一个错误的假设.此外,任何解释如何在引擎盖下实现匿名方法的资源都会很棒.TIA.

delphi anonymous-methods delphi-2010

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

C#匿名方法变量范围问题与IEnumerable <T>

我正在尝试遍历所有组件,并且对于那些实现ISupportsOpen的人来说,允许打开一个项目.问题是当调用匿名方法时,组件变量总是相同的元素(来自IEnumerable的外部作用域)

foreach (ISupportsOpen component in something.Site.Container.Components.OfType<ISupportsOpen>())
{
    MyClass m = new MyClass();  
    m.Called += new EventHandler(delegate(object sender, EventArgs e)
    {                           
        if (component.CanOpenProject(..)) component.OpenProject(..);
    });

    itemsList.Add(m);
}
Run Code Online (Sandbox Code Playgroud)

请问应该如何解决?

c# generics scope anonymous-methods

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

匿名方法作为函数结果

我想要做的是将一个匿名方法作为函数结果分配给相同类型的变量.德尔福抱怨说不能做出任命.显然Delphi的东西我想分配"GetListener"函数而不是相同函数的结果.非常感谢任何帮助.

type
      TPropertyChangedListener = reference to procedure (Sender: TStimulus);

      TMyClass = class
        function GetListener:TPropertyChangedListener
      end;


    ....

    var MyClass: TMyClass;
        Listener: TPropertyChangedListener;
    begin
      MyClass:= TMyClass.create;
      Listener:= MyClass.GetListener;   //  Delphi compile error: E2010 Incompatible types:  TPropertyChangedListener' and 'Procedure of object' 

    end; 
Run Code Online (Sandbox Code Playgroud)

delphi anonymous-methods delphi-2009

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

请指导我获取以下行c#lambda表达式代码

<%= MyClass.GetData(() => new[] { Html.TextBox(prefix + "Postcode", Customer.ZipCode, new { maxlength = 7 }), Html.ValidationIcon(prefix + "ZipCode") })%>
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下MyClass.GetData方法作为参数传递了什么吗?

我不期待一个完整的解释,我知道我应该进一步学习anonyous方法和lamda表达式...但是现在你可以解释代码是什么,从"()=> ......."手段?

如果你知道一些很好的文章,建立在理解这样的材料,那将是很酷的!

c# lambda anonymous-methods

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

用于存储匿名方法的容器

我有以下定义.

type
  TOmniTaskDelegate = reference to procedure(const task: IOmniTask);
Run Code Online (Sandbox Code Playgroud)

我应该使用什么类型的容器(应该在D2009中支持)来存储TOmniTaskDelegate实例的列表?目前我正在使用,array of TOmniTaskDelegate但我对此并不满意.

delphi containers anonymous-methods

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

使用List(Of T).ForEach方法更新未按预期工作的值

我有以下代码,

PB.ForEach(Function(x) x.Cost = GetPartCost(x.PartNumber, x.Units, x.Cost, FB))

Return PB.Sum(Function(x) (x.Cost * x.Qty))
Run Code Online (Sandbox Code Playgroud)

但它始终返回0.我已检查并且GetPartCost函数执行并返回非零数字,但列表项成本属性永远不会更新.

该物业只是一个简单的财产,

Public Property Cost() As Double
    Get
        Return _Cost
    End Get
    Set(ByVal value As Double)
        _Cost = value
    End Set
End Property
Run Code Online (Sandbox Code Playgroud)

如果我Set在属性中设置断点,它永远不会被击中.

这是怎么回事?

vb.net lambda extension-methods anonymous-methods

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

为什么我的通用匿名方法不兼容?

在我的学习过程中,我使用Nick Hodges撰写的"Delphi中的编码"一书.我正在使用Delphi 2010.

在关于匿名方法的章节中,他提供了一个关于伪造.NET的非常有趣的例子using.当我尝试编译示例时,我从编译器中收到错误.请帮我看一下结果.

我的课:

type
  TgrsObj = class
    class procedure Using<T: class>(O: T; Proc: TProc<T>); static;
  end;

implementation

{ TgrsObj }

class procedure TgrsObj.Using<T>(O: T; Proc: TProc<T>);
begin
  try
    Proc(O);
  finally
    O.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

以下是我尝试使用上述代码的方法:

procedure TForm4.Button1Click(Sender: TObject);
begin
  TgrsObj.Using(TStringStream.Create,
    procedure(ss: TStringStream)
    begin
      ss.WriteString('test string');
      Memo1.Lines.Text := ss.DataString;
    end);
end;
Run Code Online (Sandbox Code Playgroud)

编译错误:

[DCC Error] uMain.pas(36): E2010 Incompatible types: 'TProc<ugrsObj.Using<T>.T>' and 'Procedure'
Run Code Online (Sandbox Code Playgroud)

delphi generics anonymous-methods delphi-2010

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

IEnumerable中的求和,平均,连接等项的实现选项

我正在寻找最短的代码来创建方法来对IEnumerable中的项执行常见操作.

例如:

public interface IPupil
{
    string Name { get; set; }
    int Age { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
  1. 求和属性 - 例如IEnumerable <IPupil>中的IPupil.Age
  2. 平均属性 - 例如IEnumerable <IPupil>中的IPupil.Age
  3. 构建CSV字符串 - 例如IEnumerable <IPupil>中的IPupil.Name

我对解决这些例子的各种方法感兴趣:foreach(长手),委托,LINQ,匿名方法等......

对不起的措辞很抱歉,我无法准确描述我追求的是什么!

.net c# linq delegates anonymous-methods

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

使用vb.net Action(Of T)和lambda声明匿名方法的问题

Imports System.Reflection
Public Class Test
    Private Field As String
End Class

Module Module1
    Sub Main()

        Dim field = GetType(Test).GetField("Field", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance)

        Dim test = New Test

        Dim GetValue = New Func(Of Test, String)(Function(t As Test) field.GetValue(test))

        'This line indicates a compile error: 'Expression does not produce a value':
        Dim SetValue = New Action(Of Test, String)(Function(t As Test, value As String) field.SetValue(test, value))
    End Sub
 End Module


Module Module2
    Dim field = GetType(Test).GetField("Field", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance) 'Is Shared (Module)
    Sub …
Run Code Online (Sandbox Code Playgroud)

vb.net lambda action anonymous-methods

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

为什么CLR为匿名方法创建新类?

我正在我的项目中使用匿名函数.直到知道我在想,C#编译器只使用在同一个类中使用匿名方法的代码生成一个方法.但是,在IL中反编译此代码之后,我看到CLR创建了一个新类.

public class Comparer
{
    public delegate int Greater(int a, int b);

    public int Great(Greater greater, int a, int b)
    {
        return greater(a, b);
    }
}

static void Main(string[] args)
{
    int valueOfA = 11,
        valueOfB = 23,
        valueOfC = 42;

    Comparer comparer = new Comparer();

    Console.WriteLine("The greater is \t:{0}",
        comparer.Great(delegate(int a, int b)
        {
            int[] numbers = new int[] { a, b, valueOfC };
            return Math.Max(Math.Max(a, b), valueOfC);
        },
        valueOfA, valueOfB));
}
Run Code Online (Sandbox Code Playgroud)

这是Main方法的反编译IL代码:

.method private …
Run Code Online (Sandbox Code Playgroud)

.net c# clr anonymous-methods

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