delegate void DelegateTest();
DelegateTest delTest;
Run Code Online (Sandbox Code Playgroud)
电话delTest.Invoke()和delTest()?之间的区别是什么?两者都会在当前线程上执行委托,对吧?
我试图从子视图控制器调用我的根视图控制器中的方法,这样当我更改我的选项时,它们将自动更新根视图,这将更新几个其他视图控制器.对于第二部分,我使用了通知,但为此我首先尝试使用委托,因为它(所以我一直相信)是一个很好的编程习惯.我无法使其工作,并且知道我可以轻松地设置另一个通知来完成这项工作.我应该继续尝试实施代理还是仅使用通知?
我得到了一个通过参数得到代表的类.这个类调用该委托,我想用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是否被调用.谢谢.
谷歌搜索和登陆后,阅读了另一个问题
如果您在编译时不知道参数的数量或类型,是否可以从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) 我无法得到以下内容进行编译:
var x = new Action(delegate void(){});
Run Code Online (Sandbox Code Playgroud)
谁能指出我做错了什么?
我有一个叫做的课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>引脚)
您如何动态订阅C#事件,以便给定一个Object实例和一个包含事件名称的String名称,您订阅该事件并在触发该事件时执行某些操作(例如写入控制台)?
它似乎使用反射,这是不可能的,我想避免必要时使用Reflection.Emit,因为这当前(对我来说)似乎是这样做的唯一方法.
/编辑:我不知道事件所需的代表签名,这是问题的核心
/编辑2:尽管代表性逆转似乎是一个好的计划,但我无法做出使用此解决方案所必需的假设
我很感激之前已经提出了类似的问题,但我正在努力调用以下代码中的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) 我想继承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) 请考虑以下事项:
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) delegates ×10
c# ×7
.net ×3
reflection ×3
iphone ×2
events ×1
hashcode ×1
lambda ×1
linq ×1
methodinfo ×1
methods ×1
moq ×1
objective-c ×1
unit-testing ×1