访问 Func<Type> 的 Type 属性

好奇小姐

我开始接触代表,但我对下面提到的问题深有感触。谁能告诉我如何访问 a 的 Type 属性Func<Type>

我在下面解释我的场景:

这是我想要访问Func<DatabaseSession>的特定属性Session并将其传递给被调用方法的类:

namespace MyApp.WebApplication{
  public class MvcApplication{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters, Func<DatabaseSession> databaseSession){
        filters.Add(new MyAppPerformanceFilter(LocalEnvironment, databaseSession)) // here I want to pass databaseSession.Session
        // lines of code
    }
  }
}

这是DatabaseSession一流的,他们的Session财产,我需要访问:

namespace A{
    public sealed class DatabaseSession 
    {
    public ISession Session { get; private set; } // where ISession resides in the 'NHibernate' namespace
    // lines of code
    }   
}

注:databaseSession物体看起来像这样,我无法找到我需要Session在它里面特性:在此处输入图片说明

下面是我要访问该Session属性的接收器类请注意,我已将参数类型指定为objectand notFunc<DatabaseSession>DatabaseSession因为namespace A由于循环依赖而无法将 的引用添加到此项目中:

namespace B{
     public class MyAppPerformanceFilter : ActionFilterAttribute
     {
        private ISession Session { get; set; } // where ISession resides in the 'NHibernate' namespace

        public MyAppPerformanceFilter (object obj)
        {
           Session  = obj; // retrieve the value here
        }
        
        // lines of code
     }
}
杰克·T·黑桃

委托(如Func<T>)是其他编程语言所指的函数指针。基本上是一种将方法存储在变量中以便稍后调用的方法。委托只是描述了方法必须是什么样子。在这种情况下,Func<T>它意味着一个没有参数并返回 type 的方法T

这是一些愚蠢的示例代码以供澄清:

static class Maths
{
  public static int Add(int a, int b) => a + b;
  public static int Sub(int a, int b) => a - b;
  public static int Mul(int a, int b) => a * b;

  public static int DoMath(int a, int b, Func<int, int, int> func)
  {
    return func(a,b);
  }
}

class Program
{
  static void Main(string[] args)
  {
    int res = Maths.DoMath(2, 3, Maths.Mul);
  }
}

请注意,在调用时Maths.DoMathI 将Maths.Mul作为第三个参数传递而不调用它或任何其他参数。那是因为我不想在这里调用方法,而是将方法本身传递给 DoMaths。

回到你的问题,你不能从中提取SessiondatabaseSession因为后者只是一个函数,在调用时会返回一个DatabaseSession对象。所以你的代码可以像这样调整:

  public class MvcApplication{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters, Func<DatabaseSession> databaseSession){
        var dbSession = databaseSession(); //invoke passed method.
        filters.Add(new MyAppPerformanceFilter(LocalEnvironment, dbSession.Session))
        // lines of code
    }
  }

当然,如果您立即在构造函数中调用它们,那么所有这些都会使使用委托变得有点情绪化。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章