标签: delegates

在值类型上定义的扩展方法不能用于创建委托 - 为什么不呢?

可以将扩展方法分配给与对象的用法匹配的委托,如下所示:

static class FunnyExtension {
    public static string Double(this string str) { return str + str; }
    public static int Double(this int num) { return num + num; }
}


Func<string> aaMaker = "a".Double;
Func<string, string> doubler = FunnyExtension.Double;

Console.WriteLine(aaMaker());       //Prints "aa"
Console.WriteLine(doubler("b"));    //Prints "bb"
Run Code Online (Sandbox Code Playgroud)

如果他们扩展的类型是值类型,它将不起作用:

Func<int> eightMaker = 4.Double;    //Error CS1113: Extension methods 'FunnyExtension.Double(int)' defined on value type 'int' cannot be used to create delegates
Func<int, int> intDoubler = FunnyExtension.Double;  //Works
Run Code Online (Sandbox Code Playgroud)

这给了

错误CS1113:在值类型"int"上定义的扩展方法'FunnyExtension.Double(int)'不能用于创建委托.

他们为什么不能?

.net c# extension-methods delegates value-type

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

在单独的AppDomain中传递和执行委托

我想用委托在单独的AppDomain中区分一些代码.我怎样才能做到这一点?

UPD1:关于我的问题的更多细节我的程序处理一些数据(一次迭代是:从DB获取一些数据,评估它并在运行时创建程序集,执行动态程序集并将结果写入DB).

当前解决方案:每个迭代在单独的线程中运行.更好的解决方案:每个迭代在单独的AppDomain中运行(卸载动态组件).

UPD2:全部,谢谢你的回答.

我在这个帖子中找到了一个: 用AppDomains替换Process.Start

c# delegates appdomain

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

建议使用ARC声明委托属性的方法

我曾经将所有委托属性声明为

@property (assign) id<FooDelegate> delegate;
Run Code Online (Sandbox Code Playgroud)

我的印象是所有赋值属性现在都应该是弱指针,这是正确的吗?如果我试图声明为:

@property (weak) id<FooDelegate> delegate;
Run Code Online (Sandbox Code Playgroud)

我在尝试@synthesize时遇到错误(不支持自动生成的弱属性).

在这种情况下,最佳做法是什么?

cocoa-touch delegates objective-c automatic-ref-counting

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

Java中C#匿名方法的等价物?

在C#中,您可以匿名定义委托(即使它们只不过是语法糖).例如,我可以这样做:

public string DoSomething(Func<string, string> someDelegate)
{
     // Do something involving someDelegate(string s)
} 

DoSomething(delegate(string s){ return s += "asd"; });
DoSomething(delegate(string s){ return s.Reverse(); });
Run Code Online (Sandbox Code Playgroud)

是否可以在Java中传递这样的代码?我正在使用处理框架,它有一个相当旧版本的Java(它没有泛型).

c# java processing delegates anonymous-function

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

具有代表和条件的活动记录

是否可以在Active Record模型中使用委托并使用类似的条件:if

class User < ApplicationRecord
  delegate :company, :to => :master, :if => :has_master?

  belongs_to :master, :class_name => "User"

  def has_master?
    master.present?
  end
end
Run Code Online (Sandbox Code Playgroud)

ruby activerecord delegates ruby-on-rails

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

接口事件的实际使用

什么是接口事件的强大功能(在接口内声明事件)?

大多数时候我只看到界面内部的公共抽象方法.

c# events delegates interface

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

参数动作<T1,T2,T3>,其中T3可以是可选的

我有以下代码:

public static MyMethod()  
{ 
   ...Do something  
   ProtectedMethod(param1, param2);  
   ...Do something  
}  

protected static void ProtectedMethod(IEnumerable<string> param1, string param2, int param3 = 1)  
{  
   ... Do something  
}
Run Code Online (Sandbox Code Playgroud)

注意可选的param3参数.

现在由于很多原因,我需要将MyMethod方法的代码提取到它自己的类中,但我不能用它提取ProtectedMethod,因为所有继承自这个的类都需要保持变化小而孤立.所以我想我可以在新类中使用与ProtectedMethod相同签名的Action <>委托.

问题是如果我像这样声明委托:

protected readonly Action<IEnumerable<string>, string, int> m_ProtectedMethod;
Run Code Online (Sandbox Code Playgroud)

提取的代码不喜欢它,因为它表示只使用两个参数调用该方法.

如果我像这样声明代表:

protected readonly Action<IEnumerable<string>, string> m_ProtectedMethod;
Run Code Online (Sandbox Code Playgroud)

当我将它作为参数发送到新类时,它不喜欢它,因为该方法被定义为具有三个参数而不是两个参数.

到目前为止,我想到解决这个问题的唯一方法是创建一个重载版本的ProtectedMethod来消除可选参数.

这是唯一的选择还是有另一种方法,因为现在首选的选择是使用可选参数而不是重载方法?

c# oop delegates optional-parameters

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

分配null是否从对象中删除所有事件处理程序?

我在班上定义了新成员

protected COMObject.Call call_ = null;
Run Code Online (Sandbox Code Playgroud)

该类具有我订阅的以下事件处理程序

call_.Destructed += new COMObject.DestructedEventHandler(CallDestructedEvent);
Run Code Online (Sandbox Code Playgroud)

将我的成员设置为null,如下所示删除事件处理程序?

call_ = null;
Run Code Online (Sandbox Code Playgroud)

或者我必须取消订阅 - =?

.net c# com delegates event-handling

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

是否使用Action.Invoke被认为是最佳做法?

如果我有以下代码,我应该只调用Action还是应该调用Action.Invoke?

public class ClassA
{
  public event Action<string> OnAdd;

  private void SomethingHappened()
  {
    if (OnAdd != null)
     OnAdd("It Happened"); //Should it be OnAdd.Invoke("It Happened") ???????
  }
}

public class ClassB
{

  public ClassB()
  {
    var myClass = new ClassA();
    myClass.OnAdd += Add;
  }

  private void Add(string Input)
  {
    //do something
  }  
}
Run Code Online (Sandbox Code Playgroud)

.net c# delegates

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

无法将lambda表达式转换为类型"object",因为它不是委托类型

我有一个具有bool属性的基类,如下所示:

public abstract class MyBaseClass
{
     public bool InProgress { get; protected set; }
}
Run Code Online (Sandbox Code Playgroud)

我从它继承了另一个类,并尝试将InProgress添加为字典的委托.但它给我一个错误.这就是我的Derived类的样子:

public abstract class MyClass
{
     Dictionary<string, object> dict = new Dictionary<string, object>();
     dict.Add("InProgress", InProgress => base.InProgress = InProgress);

}
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误:

无法将lambda表达式转换为类型"object",因为它不是委托类型

我在这做错了什么?

c# linq lambda delegates

30
推荐指数
3
解决办法
6万
查看次数