C#Func<;T、 TResult>;参数验证
想象一下FuncC#Func<;T、 TResult>;参数验证,c#,func,C#,Func,想象一下FuncFunc,其中参数是一个抽象类。在某个地方,出于某种原因,我创建了这些函数的列表,其中包含所有类型的派生类作为参数。当然,参数的类型对于调用Func之前的验证非常重要。是否有方法获取参数的类型 e、 g: 公共图书馆?测试(参数arg){ Func测试=Func; 类型argType=GetFirstArgumentType(test);//给出一些参数。GetType(); if(arg.GetType()==argType){ 返回测试(newsomearguments())
Func
,其中参数
是一个抽象类。在某个地方,出于某种原因,我创建了这些函数的列表,其中包含所有类型的派生类作为参数。当然,参数的类型对于调用Func
之前的验证非常重要。是否有方法获取参数的类型
e、 g:
公共图书馆?测试(参数arg){
Func测试=Func;
类型argType=GetFirstArgumentType(test);//给出一些参数。GetType();
if(arg.GetType()==argType){
返回测试(newsomearguments());
}
返回null;
}
您可以使用来获取系统。键入函数的第一个泛型参数的
也就是说,存储一个字典来保存您的类型可能会更容易,只需直接查找即可。根据您的描述,“出于某种原因,我在某个地方创建了一个包含所有类型派生类作为参数的函数列表。”我建议您使用:
公共图书馆?test(T arg),其中T:Arguments,new()
{
var类型=类型(T);
// ...
}
这将为您提供您描述的类型检查 将它们存储在字典中,而不是它们的列表中。如果您计划有重复项,您可能只需要将其列为键值对列表。您是否正在尝试了解如何实现GetFirstArgumentType
?是否正在寻找同样适用于派生类的内容?@ReedCopsey:是的;-)虽然我怀疑这是可以挽回的。。(?)@JvN我刚才提供了一个答案-注意,可能有更简单的方法来实现这一点…谢谢!我想这就是我要找的!
public bool? test(Arguments arg) {
Func test = Func<SomeArguments, bool?>;
Type argType = GetFirstArgumentType(test); // gives SomeArguments.GetType();
if (arg.GetType() == argType) {
return test(new SomeArguments());
}
return null;
}
public bool? test<T>(T arg) where T :Arguments, new()
{
var type = typeof(T);
// ...
}