【问题标题】:C# Func<T,TResult> arguments validationC# Func<T,TResult> 参数验证
【发布时间】:2013-11-15 10:37:18
【问题描述】:

想象一下 Func Func&lt;Arguments, bool?&gt;,其中 Arguments 是一个抽象类。在某个地方,出于某种原因,我创建了一个这些函数的列表,其中包含所有类型的派生类作为参数。当然,Arguments 的类型对于调用 Func 之前的验证很重要。有没有办法获取Arguments的类型?

例如:

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

【问题讨论】:

  • 将它们存储在Dictionary&lt;Type, Func&lt;object, bool?&gt;&gt; 中,而不是它们的列表。如果您打算有重复项,您可能需要将其设为键值对列表。
  • 您是否想弄清楚如何实现GetFirstArgumentType
  • 您是否正在寻找类似How to get actual type of an derived class from its parent interface 的东西,它也适用于派生类?
  • @ReedCopsey:是的,我是 ;-) 虽然我怀疑它是不可撤销的.. (?)
  • @JvN 我刚刚提供了一个答案 - 请注意,可能有更简单的方法来完成这个......

标签: c# func


【解决方案1】:

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

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

     // ...              
 }

这将为您提供您描述的类型检查。

【讨论】:

    【解决方案2】:

    您可以使用Type.GetGenericArguments 获取Func&lt;T,bool?&gt; 的第一个通用参数的System.Type

    话虽如此,存储 Dictionary&lt;Type, Delegate&gt; 来保存您的类型可能会更容易,而是直接进行查找。

    【讨论】:

    • 谢谢!我想这就是我要找的东西!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    相关资源
    最近更新 更多