2013-11-04 44 views
1

想象一下Func Func<Arguments, bool?>,其中Arguments是一个抽象类。某处,出于某种原因,我创建了这些函数的列表,并将所有派生类作为参数。当然,在调用Func之前,Arguments的类型对验证很重要。有没有办法获得Arguments的类型?C#Func <T,TResult>参数验证

例如为:

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; 
} 
+1

而不是它们的列表,将它们存储在'Dictionary >'中。如果您计划重复,则可能需要将其作为关键值对的列表。 – Magus

+0

你想知道如何实现'GetFirstArgumentType'吗? –

+0

您是否在寻找类似[[如何从其父接口获取实际类型的派生类]](http://stackoverflow.com/q/2520694/2145211),它也适用于派生类? – Harrison

回答

2

您可以使用Type.GetGenericArguments拿到第一个通用参数的System.TypeFunc<T,bool?>

这就是说,存储一个Dictionary<Type, Delegate>来保存你的类型可能会更容易,只需要直接进行查找。

+0

谢谢!我想这就是我正在寻找的! – JvN

0

根据您的描述,“在某处,出于某种原因,我创建的这些功能与所有类型的派生类作为参数列表。”我可能会建议你使用a parameter constraint

public bool? test<T>(T arg) where T :Arguments, new() 
{ 
    var type = typeof(T); 

    // ...    
} 

这将让你检查你描述的类型。