我在这样的代码中有一本字典:
Dictionary<string, Delegate> BODictionary= new Dictionary<string, Delegate>();
我想为字典添加许多类型的函数签名,但是只声明一个泛型委托我尝试执行此代码:
public class BOMock : BOBase
{
// private delegate int DelInt(int id);
// private delegate string DelString(string name);
public delegate T Del<T>(T item);
public int Id { get; set; }
public string Name { get; set; }
public BOMock() : base()
{
}
public BOMock(int id, string name) : base()
{
Id = id;
Name = name;
}
public override long Init(IModule module, ref Dictionary<string, Delegate> BODictionary)
{
try
{
base.Init(module, ref BODictionary);
BODictionary.Add(this.GetType().Name + "." + nameof(getMockById), new Del<int>(getMockById));
BODictionary.Add(this.GetType().Name + "." + nameof(getMockByName), new Del<string>(getMockByName));
**BODictionary.Add(this.GetType().Name + "." + nameof(getAllMock), new Del<Action>(getAllMock)????);// is it possible?**
BODictionary.Add(this.GetType().Name + "." + nameof(getAllMock), new Del<Action>(getAllMock1));// is it possible?
BODictionary.Add(this.GetType().Name + "." + nameof(getAllMock), new Del<string>(getAllMock2));// is it possible?
return 0;
}
catch (Exception ex)
{
return ex.HResult;
}
}
private int getMockById(int Id)
{
return Id;
}
private string getMockByName(string name)
{
return name;
}
private void getAllMock()
{
}
private void getAllMock1(string name)
{
}
private string getAllMock2()
{
return "";
}
}
如何声明一个也返回参数的泛型委托,并且不返回获取参数但是没有得到? ,
有人有什么想法吗?感谢
答案 0 :(得分:0)
您的委托被声明为期待 T
和返回的实例。因此,如果您提供Action
的实例,则必须返回 Action
。为了让代理人根本不返回任何代表:
delegate void SecondDel<T>(T item);
或只是Action<T> SecondDel
,这是前者的捷径。
但是,当您将所有代理放入仅具有Delegate
值的单个字典时,即使这样也不会对您有所帮助。但是Delegate
不是强类型的,因此以下方法不起作用:
var del = BODictionary("myString");
int i = del(1);
var another del = BODictionary("MyString2");
string anotherDel("Hello World");
因为字典中的值只是Delegate
。因此,即使您将Func<int>
(这是delegate T MyDel<T>()
的另一个快捷方式)放入具有Func<string>
的同一字典中,您也无法期待编译器推断出预期密钥的正确类型 - 这是运行时信息。字典对于其所有值都具有一个类型,而不是第一个值的一个类型和第二个值的另一个类型。
要执行委托,您需要致电DynamicInvoke
。但是,这只会重新计算object
,您必须将其转换为实际类型:
var del = BODictionary("myString");
int i = (int) del.DynamicInvoke(1);
var another del = BODictionary("MyString2");
string str = (string) anotherDel.DynamicInvoke("Hello World");