可以将扩展方法分配给与对象的用法匹配的委托,如下所示:
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)'不能用于创建委托.
他们为什么不能?
我想用委托在单独的AppDomain中区分一些代码.我怎样才能做到这一点?
UPD1:关于我的问题的更多细节我的程序处理一些数据(一次迭代是:从DB获取一些数据,评估它并在运行时创建程序集,执行动态程序集并将结果写入DB).
当前解决方案:每个迭代在单独的线程中运行.更好的解决方案:每个迭代在单独的AppDomain中运行(卸载动态组件).
UPD2:全部,谢谢你的回答.
我在这个帖子中找到了一个: 用AppDomains替换Process.Start
我曾经将所有委托属性声明为
@property (assign) id<FooDelegate> delegate;
Run Code Online (Sandbox Code Playgroud)
我的印象是所有赋值属性现在都应该是弱指针,这是正确的吗?如果我试图声明为:
@property (weak) id<FooDelegate> delegate;
Run Code Online (Sandbox Code Playgroud)
我在尝试@synthesize时遇到错误(不支持自动生成的弱属性).
在这种情况下,最佳做法是什么?
在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(它没有泛型).
是否可以在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) 什么是接口事件的强大功能(在接口内声明事件)?
大多数时候我只看到界面内部的公共抽象方法.
我有以下代码:
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来消除可选参数.
这是唯一的选择还是有另一种方法,因为现在首选的选择是使用可选参数而不是重载方法?
我在班上定义了新成员
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)
或者我必须取消订阅 - =?
如果我有以下代码,我应该只调用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) 我有一个具有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",因为它不是委托类型
我在这做错了什么?
delegates ×10
c# ×8
.net ×3
activerecord ×1
appdomain ×1
cocoa-touch ×1
com ×1
events ×1
interface ×1
java ×1
lambda ×1
linq ×1
objective-c ×1
oop ×1
processing ×1
ruby ×1
value-type ×1