Tag: 代表

“Uncurrying”.NET中的实例方法

您是否可以创建实例方法的委托而无需在创建时指定实例? 换句话说,你可以创建一个“静态”委托,它应该调用该方法的实例作为它的第一个参数吗? 例如,如何使用reflection构造以下委托? Func = i=>i.ToString(); 我知道我可以使用methodInfo.Invoke,但速度较慢,并且在调用之前不检查类型正确性。 当您拥有特定静态方法的MethodInfo时,可以使用Delegate.CreateDelegate(delegateType, methodInfo)构造委托,并且静态方法的所有参数都保持空闲。 正如Jon Skeet指出的那样,如果方法在引用类型上是非虚拟的,则可以简单地应用相同的方法来创建实例方法的开放委托。 决定在虚拟方法上调用哪个方法很棘手,因此不是那么简单,值类型看起来根本不起作用。 对于值类型, CreateDelegate表现出非常奇怪的行为: var func37 = (Func)(37.ToString); var toStringMethod = typeof(int).GetMethod(“ToString”, BindingFlags.Instance | BindingFlags.Public, null, new Type[] {typeof(CultureInfo) }, null); var func42 = (Func)Delegate.CreateDelegate(typeof(Func), 42, toStringMethod,true); Console.WriteLine( object.ReferenceEquals(func37.Method,func42.Method)); //true Console.WriteLine(func37.Target);//37 Console.WriteLine(func42.Target);//42 Console.WriteLine(func37(CultureInfo.InvariantCulture));//37 Console.WriteLine(func42(CultureInfo.InvariantCulture));//-201040128… WTF? 如果实例方法属于值类型(这适用于引用类型),则使用null作为目标对象调用CreateDelegate会引发绑定exception。 几年后的一些后续行动:导致func42(CultureInfo.InvariantCulture);的错误绑定目标func42(CultureInfo.InvariantCulture); 在我的示例中返回”-201040128″而不是”42″是内存损坏,可能允许远程代码执行( cve-2010-1898 ); 这是在2010年ms10-060安全更新中修复的。 当前框架正确打印42! 这并没有使回答这个问题变得更容易,但解释了这个例子中特别奇怪的行为。

如何为.NET属性创建委托?

我正在尝试创建一个委托(作为测试): Public Overridable ReadOnly Property PropertyName() As String 我的直觉尝试是声明代表这样: Public Delegate Function Test() As String 并实例化如下: Dim t As Test = AddressOf e.PropertyName 但这会引发错误: 方法’Public Overridable ReadOnly Property PropertyName()As String’没有与委托’Delegate Function Test()As String’兼容的签名。 因为我正在处理一个属性,我试过这个: Public Delegate Property Test() As String 但这会引发编译器错误。 所以问题是,我如何为一个财产代表? 看到这个链接: http://peisker.net/dotnet/propertydelegates.htm

为什么要使用“new DelegateType(Delegate)”?

好的,假设你在某个类中定义了一个委托。 public delegate void StringDelegate (string s); 另一个类实现了一个方法: public static void StringWriter (string s) {…} 在我正在阅读“Programming C#”第4版的书中,他们使用new关键字创建委托,例如: ClassDelegate.StringDelegate writer; writer = new ClassDelegate.StringDelegate (DelegateImplementer.StringWriter); writer(“Hello”); 但是,我看到也可以通过这种方式调用委托方法 ClassDelegate.StringDelegate writer; writer = DelegateImplementer.StringWriter; writer (“Hello”); 有什么不同? 当我只是简单地传递或引用方法委托的签名时,为什么我想要实例化并创建一个对象委托。

隐式和显式委托创建之间的区别(有和没有generics)

请参阅下面的Go()方法中的四行: delegate void Action(T arg); delegate void Action(); void DoSomething(Action action) { //… } void DoSomething(Action action) { //… } void MyAction(T arg) { //… } void MyAction() { //… } void Go() { DoSomething(MyAction); // throws compiler error – why? DoSomething(new Action(MyAction)); // no problems here DoSomething(MyAction); // what’s the difference between this… DoSomething(new […]

“字段初始值设定项不能引用非静态字段”在C#中意味着什么?

我不明白C#中的这个错误 错误CS0236:字段初始值设定项无法引用非静态字段,方法或属性’Prv.DB.getUserName(long)’ 对于以下代码 public class MyDictionary { public delegate V NonExistentKey(K k); NonExistentKey nonExistentKey; public MyDictionary(NonExistentKey nonExistentKey_) { } } class DB { SQLiteConnection connection; SQLiteCommand command; MyDictionary usernameDict = new MyDictionary(getUserName); string getUserName(long userId) { } }

如何从struct的实例方法创建一个开放的Delegate?

我有一个带有私有方法的结构,我想调用它。 由于我计划在性能关键部分执行此操作,因此我想缓存一个委托以执行操作。 问题是我似乎无法使用Delegate.CreateDelegate绑定到它的方法。 有问题的结构不是我的创建,用于与第三方库的交互。 有问题的结构看起来像这样:: public struct A { private int SomeMethod() { //body go here } } 以下代码将失败,并出现“绑定到目标方法的错误”。 Delegate.CreateDelegate(typeof(Func),typeof(A).GetMethod(“SomeMethod”,BindingFlags.Instance | BindingFlags.NonPublic)); 我知道我可以编写一个表达式树来执行该操作,但似乎奇怪的是我无法使用我的普通goto来处理Delegate.CreateDelegate方法。 如果A是一个类,上面的代码就可以了。 这个问题只是因为A是结构而产生的。 MSDN文档对于CreateDelegate的这个重载是不正确的,因为它对非静态方法起作用。

有人可以提炼成适当的英语代表是什么吗?

有人可以将一个代表分解成一个简单,简短和简洁的解释,包括目的和一般的好处吗? 我试图绕过这个,但它并没有陷入其中。

在3个单独的WinForms之间传递数据

在C#WinForms领域的整个编码过程中,我遇到过许多实例,在这些实例中我遇到了在表单之间传递数据的不同方法。 我在一个大型代码库上工作 – 其中一些方法是由其他人编写的,我后来扩展了,其他的都是我自己编写的。 似乎有两个主要的范例,我编写的这两个范例相当舒服。 1.)在实例化或显示子表单时,将父表单传递给子表单。 例如: ChildForm.Instance = new ChildForm(this); –Or– ChildForm.Instance = new ChildForm(); ChildForm.Instance.Show(this.TopLevelControl); 这允许孩子从父母那里提取信息,并允许父母调用孩子的方法。 忍受我一会儿 – 我确实意识到这打破了这么多范例,并且是“糟糕”的做法 – 记住,我在维护更大的代码库时遇到了大部分问题,我需要对其进行增量调整没有做完整的重构。 2.)使用事件委托允许在父表单和子表单之间传输数据。 据我所知,这仍然需要父表单在产生孩子时建立此事件。 例如: 在父母内: childForm = new ChildForm(this); DataRead += new DataReadEventHandler(childForm.ChildForm_DataRead); 在孩子内: public void ChildForm_DataRead(Data data) { if (InvokeRequired) { Invoke(new MethodInvoker(delegate() { ChildForm_DataRead(data); })); } else //do something } 这种性质的东西。 […]

无法分配委托具有较少特定参数类型的匿名方法

我能够分配一个方法M来委托具有较少特定参数类型的对象d ,但是当我想要将具有相同签名的匿名方法分配给方法M到d ,我得到一个错误。 这是为什么? class derivedEventArgs : EventArgs { } delegate void newDelegate(object o, derivedEventArgs e); static void Main(string[] args) { newDelegate d = M; // ok d = (object o, EventArgs e) => { }; // error } public static void M(object o, EventArgs e) { }

QueueUserWorkItem()和BeginInvoke()之间的区别是什么,用于执行不需要返回类型的异步活动

继我的BeginInvoke()/ EndInvoke()问题后,在Delegate.BeginInvoke()和使用QueueUserWorkItem()异步调用委托之间的性能/其他任何方面是否存在重大差异?