认为我有一个类如下:
public class Foo
{
public int Bar { get; set; }
public int Sum(int a, int b)
{
return a + b;
}
public int Square(int a)
{
return a * a;
}
}
Run Code Online (Sandbox Code Playgroud)
你只知道我可以编写一个返回给定属性名称的方法:
var name = GetPropertyName<Foo>(f => f.Bar); //returns "Bar"
Run Code Online (Sandbox Code Playgroud)
GetPropertyName方法可以轻松实现,如下所示:
public static string GetPropertyName<T>(Expression<Func<T, object>> exp)
{
var body = exp.Body as MemberExpression;
if (body == null)
{
var ubody = (UnaryExpression)exp.Body;
body = ubody.Operand as MemberExpression;
}
return body.Member.Name;
}
Run Code Online (Sandbox Code Playgroud)
但我想像下面的属性名一样轻松获取方法名称:
var name1 = …
Run Code Online (Sandbox Code Playgroud) 我有一个类,我用Castle Dynamic Proxy代理它.我想为代理方法添加一些自定义属性(在代理类中没有定义).这可能吗.
我想要这个,因为我想为我的应用程序的服务层生成ASP.NET Web API层.我代理服务(继承自ApiController和其他IMyService接口),它工作得很好,但我想为这个新创建的Dynamic类添加特定于WebAPI的属性,因此Web API框架可以读取它们.
编辑:
如果有人想知道我想要什么,我想详细解释一下.
public interface IMyService
{
IEnumerable<MyEntity> GetAll();
}
public class MyServiceImpl : IMyService
{
public IEnumerable<MyEntity> GetAll()
{
return new List<MyEntity>(); //TODO: Get from database!
}
}
public class MyServiceApiController : ApiController,IMyService
{
private readonly IMyService _myService;
public MyServiceApiController(IMyService myService)
{
_myService = myService;
}
public IEnumerable<MyEntity> GetAll()
{
return _myService.GetAll();
}
}
Run Code Online (Sandbox Code Playgroud)
认为我有一个由MyServiceImpl实现的IMyService.我想让一个Api控制器能够从网上使用这项服务.但正如您所见,api控制器只是实际服务的代理.那么,为什么我要写呢?我可以使用城堡windsor动态创建它.
这是我的想法,几乎在我的新项目(https://github.com/hikalkan/aspnetboilerplate)中完成.但是,如果我需要向api控制器的GetAll方法添加一些属性(例如Authorize),该怎么办呢?我不能直接添加,因为没有这样的类,它是城堡动态代理.
所以,除了这个问题.我想知道是否可以向synamic代理类的方法添加属性.
dependency-injection castle-windsor castle castle-dynamicproxy inversion-of-control