为了账号安全,请及时绑定邮箱和手机立即绑定

在 Func 中使用泛型类型参数,并使用特定类型调用 Func?

在 Func 中使用泛型类型参数,并使用特定类型调用 Func?

C#
素胚勾勒不出你 2021-10-09 19:47:05
我有以下方法在 aT中使用Func:public void DoSomething<T>(string someString, Func<T, bool> someMethod) {        if(someCondition)     {        string A;        bool resultA = someMethod(A);    }    else     {        string[] B;        bool resultB = someMethod(B);    }        // Some other stuff here ...}我正在DoSomething以下列方式调用该方法:DoSomething<string>("abc", someMethod);DoSomething<string[]>("abc", someMethod);并且 someMethod 存在,具有以下定义:bool someMethod(string simpleString);bool someMethod(string[] stringArray);现在编译失败,方法中出现以下错误DoSomething:cannot convert from 'string' to 'T'cannot convert from 'string[]' to 'T'我无法弄清楚问题是否有解决方案,或者我尝试的方法不可行。它看起来类似于问题如何使用泛型类型参数传入 func?,虽然它对我的场景没有帮助。
查看完整描述

2 回答

?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

你的例子看起来有点不一致,但如果你写的是一般的东西,它应该看起来更像这样:


public void DoSomething<T>(string someString, Func<T, bool> someMethod) 

{

    T a;

    someMethod(a);

}

请注意,不是使用if在类型之间进行选择,然后将类型声明为 astring或string[],而是简单地将类型声明为T,它会在编译代码时被替换,以便它适用于函数。


当您发现自己使用ifor在类型之间进行选择时switch case,您可能不需要通用解决方案;事实上,这个逻辑根本不是通用的。它是具体的。在这种情况下,只需编写两个原型:


public void DoSomething(string someString, Func<string, bool> someMethod) 

{    

    string A;

    bool resultA = someMethod(A);

}



public void DoSomething(string someString, Func<string[], bool> someMethod) 

{    

    string[] A;

    bool resultA = someMethod(A);

}

这称为方法重载。编译器将通过从提供的函数推断类型来自动选择具有正确参数的正确方法。


查看完整回答
反对 回复 2021-10-09
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

您可以通过反射实现它:


public void DoSomething<T>(string someString, Func<T, bool> someMethod)

{

    var args = new Dictionary<Type, object>

    {

        [typeof(string)] = "string", //string A;

        [typeof(string[])] = new[] { "string" }, //string[] B;

    };

    var arg = args[typeof(T)];

    var result = (bool)someMethod.Method.Invoke(someMethod.Target, new[] { arg });

}

用法:


DoSomething<string>("abc", someMethod);

DoSomething<string[]>("abc", someMethod);


查看完整回答
反对 回复 2021-10-09
  • 2 回答
  • 0 关注
  • 218 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信