我开始接触代表,但我对下面提到的问题深有感触。谁能告诉我如何访问 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
属性的接收器类。请注意,我已将参数类型指定为object
and 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
}
}
委托(如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.DoMath
I 将Maths.Mul
作为第三个参数传递而不调用它或任何其他参数。那是因为我不想在这里调用方法,而是将方法本身传递给 DoMaths。
回到你的问题,你不能从中提取Session
,databaseSession
因为后者只是一个函数,在调用时会返回一个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] 删除。
我来说两句