访问 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
}
}
当然,如果您立即在构造函数中调用委托,所有这些都会让使用委托变得有点情绪化。
我开始接触代表,但我对下面提到的问题非常困惑。谁能告诉我如何访问 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
}
}
当然,如果您立即在构造函数中调用委托,所有这些都会让使用委托变得有点情绪化。