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);
}
这称为方法重载。编译器将通过从提供的函数推断类型来自动选择具有正确参数的正确方法。
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);
- 2 回答
- 0 关注
- 218 浏览
添加回答
举报