声明通过参数接收而没有参数的通用委托并将其添加到字典C#

时间:2018-05-03 07:36:01

标签: c# .net dictionary generics delegates

我在这样的代码中有一本字典:

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 "";
    }
}

如何声明一个也返回参数的泛型委托,并且不返回获取参数但是没有得到? ,

有人有什么想法吗?

感谢

1 个答案:

答案 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");