访问 Func<Type> 的类型属性

Accessing Type properties of Func<Type>

我开始接触代表,但我对下面提到的问题非常困惑。谁能告诉我如何访问 Func<Type> 的类型属性?

我在下面解释我的场景:

这是 class,我想在其中访问 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 class,我需要访问其 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 属性:

下面是接收器 class,我想在其中访问 Session 属性。请注意,我已将参数类型指定为 object 而不是 Func<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
     }
}

委托(如Func<T>)是其他编程语言所指的函数指针。这基本上是一种将方法存储在变量中以便稍后调用的方法。委托简单地描述了方法必须是什么样子。在 Func<T> 的情况下,它意味着一个没有参数的方法和 returns 类型 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.DoMath 时,我将 Maths.Mul 作为第三个参数传递,而没有调用它或任何东西。那是因为我不想在这里调用该方法,而是将方法本身传递给 DoMaths。

回到你的问题,你不能从 databaseSession 中提取 Session 因为后者只是一个函数,在调用时,将 return 和 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
    }
  }

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