标签: delegates

Delegate.Invoke和Delegate()之间的区别

delegate void DelegateTest();

DelegateTest delTest;
Run Code Online (Sandbox Code Playgroud)

电话delTest.Invoke()delTest()?之间的区别是什么?两者都会在当前线程上执行委托,对吧?

c# delegates

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

代表人数 iPhoneOS中的通知

我试图从子视图控制器调用我的根视图控制器中的方法,这样当我更改我的选项时,它们将自动更新根视图,这将更新几个其他视图控制器.对于第二部分,我使用了通知,但为此我首先尝试使用委托,因为它(所以我一直相信)是一个很好的编程习惯.我无法使其工作,并且知道我可以轻松地设置另一个通知来完成这项工作.我应该继续尝试实施代理还是仅使用通知?

iphone notifications delegates

33
推荐指数
4
解决办法
2万
查看次数

Moq调用了一名代表

我得到了一个通过参数得到代表的类.这个类调用该委托,我想用Moq对它进行单元测试.我如何验证这个方法被调用?

示例类:

public delegate void Foo(int number);

public class A
{
   int a = 5;

   public A(Foo myFoo)
   {
      myFoo(a);
   }
}
Run Code Online (Sandbox Code Playgroud)

我想检查Foo是否被调用.谢谢.

c# delegates unit-testing moq

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

从MethodInfo构建委托?

谷歌搜索和登陆后,阅读了另一个问题

如果您在编译时不知道参数的数量或类型,是否可以从MethodInfo构建正确的委托?

更多关于此:如果不使用Reflection.Emit或类型构建器,这可以优雅地完成吗?

这对我来说有点令人失望,因为Delegate.CreateDelegate要求我指定正确的Delegate类型作为第一个参数,否则它会抛出异常或调用不正确的方法.

我正在建造一些忍者齿轮,这会有很大的帮助......谢谢!


这是一个通用的解决方案:

/// <summary>
/// Builds a Delegate instance from the supplied MethodInfo object and a target to invoke against.
/// </summary>
public static Delegate ToDelegate(MethodInfo mi, object target)
{
    if (mi == null) throw new ArgumentNullException("mi");

    Type delegateType;

    var typeArgs = mi.GetParameters()
        .Select(p => p.ParameterType)
        .ToList();

    // builds a delegate type
    if (mi.ReturnType == typeof(void)) {
        delegateType = Expression.GetActionType(typeArgs.ToArray());

    } else {
        typeArgs.Add(mi.ReturnType);
        delegateType = Expression.GetFuncType(typeArgs.ToArray());
    }

    // creates a binded …
Run Code Online (Sandbox Code Playgroud)

.net reflection delegates methodinfo

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

内联委托声明(c#)

我无法得到以下内容进行编译:

var x = new Action(delegate void(){});
Run Code Online (Sandbox Code Playgroud)

谁能指出我做错了什么?

c# delegates

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

C#无法将方法转换为非委托类型

我有一个叫做的课Pin.

public class Pin
{
    private string title;

    public Pin() { }

    public setTitle(string title) {
        this.title = title;
    }
    public String getTitle()
    {
        return title;
    }
}
Run Code Online (Sandbox Code Playgroud)

从另一个类我在引脚中添加Pins对象,从另一个类我List<Pin>想迭代List引脚并获取元素.所以我有这个代码.

foreach (Pin obj in ClassListPin.pins)
{
     string t = obj.getTitle;
}
Run Code Online (Sandbox Code Playgroud)

使用此代码,我无法检索标题.为什么?

(注意:ClassListPin只是一个包含一些元素的静态类,其中一个是List<Pin>引脚)

.net c# methods delegates

32
推荐指数
5
解决办法
8万
查看次数

C#动态事件订阅

您如何动态订阅C#事件,以便给定一个Object实例和一个包含事件名称的String名称,您订阅该事件并在触发该事件时执行某些操作(例如写入控制台)?

它似乎使用反射,这是不可能的,我想避免必要时使用Reflection.Emit,因为这当前(对我来说)似乎是这样做的唯一方法.

/编辑:我不知道事件所需的代表签名,这是问题的核心

/编辑2:尽管代表性逆转似乎是一个好的计划,但我无法做出使用此解决方案所必需的假设

c# reflection events delegates

31
推荐指数
2
解决办法
3万
查看次数

如何使用反射调用扩展方法?

我很感激之前已经提出了类似的问题,但我正在努力调用以下代码中的Linq Where方法.我希望使用反射动态调用此方法,并动态构建Where子句中使用的委托(或lambda).这是一个简短的代码示例,一旦工作,将有助于形成我正在构建的解释DSL的一部分.干杯.

    public static void CallWhereMethod()
    {
        List<MyObject> myObjects = new List<MyObject>(){new MyObject{Name="Jon Simpson"}};
        System.Delegate NameEquals = BuildEqFuncFor<MyObject>("Name", "Jon Simpson");
        object[] atts = new object[1] ;
        atts[0] = NameEquals;

        var ret = typeof(List<MyObject>).InvokeMember("Where", BindingFlags.InvokeMethod, null, InstanceList,atts);
    }

    public static Func<T, bool> BuildEqFuncFor<T>(string prop, object val)
    {
        return t => t.GetType().InvokeMember(prop,BindingFlags.GetProperty,
                                             null,t,null) == val;
    }
Run Code Online (Sandbox Code Playgroud)

c# linq reflection lambda delegates

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

如何在目标C中扩展委托的协议,然后将对象子类化以要求一致的委托

我想继承UITextView,并向委托发送一条新消息.所以,我想扩展委托协议.这样做的正确方法是什么?

我从这开始:

接口:

#import <Foundation/Foundation.h>

@class MySubClass;

@protocol MySubClassDelegate <UITextViewDelegate>
- (void) MySubClassMessage: (MySubClass *) subclass;
@end


@interface MySubClass : UITextView {
}

@end
Run Code Online (Sandbox Code Playgroud)

执行:

#import "MySubClass.h"


@implementation MySubClass

- (void) SomeMethod; { 
    if ([self.delegate respondsToSelector: @selector (MySubClassMessage:)]) { 
        [self.delegate MySubClassMessage: self];
    }
}

@end
Run Code Online (Sandbox Code Playgroud)

然而我得到了警告:'-MySubClassMessage:' not found in protocol(s).

我有一种工作方式,我创建自己的ivar来存储委托,然后也使用[super setDelegate] 但是这似乎是错误的存储委托.也许不是.

我知道我可以直接传递id,但我的目标是确保编译器检查提供给MySubClass的任何委托是否符合MySubClassDelegate协议.

为了进一步克服:

@interface MySubClassTester : NSObject {

}

@implementation MySubClassTester

- (void) one { 
    MySubClass *subclass = [[MySubClass alloc] init];
    subclass.delegate = self;
} …
Run Code Online (Sandbox Code Playgroud)

iphone delegates objective-c

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

为什么2个委托实例返回相同的哈希码?

请考虑以下事项:

  var x =  new Action(() => { Console.Write("") ; });
  var y = new Action(() => { });
  var a = x.GetHashCode();
  var b = y.GetHashCode();
  Console.WriteLine(a == b);
  Console.WriteLine(x == y);
Run Code Online (Sandbox Code Playgroud)

这将打印:

True
False
Run Code Online (Sandbox Code Playgroud)

为什么哈希码相同?

这有点令人惊讶,并且会使代表的使用Dictionary速度与a List(也就是O(n)查找)一样慢.

更新:

问题是为什么.IOW谁做出这样一个(愚蠢的)决定?

一个更好的哈希码实现应该是:

return Method ^ Target == null ? 0 : Target.GetHashcode();
// where Method is IntPtr
Run Code Online (Sandbox Code Playgroud)

.net c# delegates hashcode

31
推荐指数
1
解决办法
2433
查看次数