Lim*_*ing 2 c# razor asp.net-mvc-4
这可能是一个愚蠢的问题,但我正在开发一个组件,我有一个类具有如下属性的类
public class Grid()
{
..
public IDecorator Decorator { get; set;}
}
Run Code Online (Sandbox Code Playgroud)
我想要的是让用户以下列方式指定自己的实现IDecorator的自定义类
...BuildGrid(
grid=>{
..
grid.Decorator = [CustomNameSpace].[DecoratorClass]
//as in
grid.Decorator = Com.MyCompany.DivDecorator
..
});
Run Code Online (Sandbox Code Playgroud)
Com.MyCompany.DivDecorator实现了IDecorator接口.那么我应该如何在没有最终用户指定"new"关键字的情况下执行此操作
grid.Decorator = new Com.MyCompany.DivDecorator();
Run Code Online (Sandbox Code Playgroud)
我知道我在这里错过了一些关键的c#概念.
谢谢
[编辑]
我试图做像这里的Java DisplayTag库这样的事情
http://www.displaytag.org/1.2/tut_decorators.html
他们这样做的方式是
... decorator="org.displaytag.sample.Wrapper"
所以我想而不是
public IDecorator Decorator { get; set;}
Run Code Online (Sandbox Code Playgroud)
我应该做
public String Decorator (get; set;}
Run Code Online (Sandbox Code Playgroud)
然后在内部使用TypeOf()来解决它....只是想知道是否有任何其他方式优雅地在C#中执行它.
谢谢
那么你可以使用工厂方法:
public class DivDecorator
{
public static IDecorator Create()
{
return new Com.MyCompany.DivDecorator()
}
}
...
grid.Decorator = Com.MyCompany.DivDecorator.Create();
Run Code Online (Sandbox Code Playgroud)
或单身人士:
public class DivDecorator
{
public static readonly IDecorator Instance = new DivDecorator();
}
...
grid.Decorator = Com.MyCompany.DivDecorator.Instance;
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,您只是将new操作员移动到其他位置.
或者,您可以让用户指定类型,然后您需要担心在需要时实例化它:
public class Grid
{
public Type DecoratorType { get; set; }
private IDecorator CreateDecorator()
{
return (IDecorator)Activator.CreateInstance(this.DecoratorType);
}
}
...
grid.Decorator = typeof(Com.MyCompany.DivDecorator);
Run Code Online (Sandbox Code Playgroud)
甚至更好,使用泛型:
public class Grid<T> where T : IDecorator, new
{
private T CreateDecorator()
{
return new T();
}
}
BuildGrid<Com.MyCompany.DivDecorator>(grid => ... );
Run Code Online (Sandbox Code Playgroud)
如果我理解你在寻找什么,你可以使用通用:
public class Grid<TDecorator> where TDecorator : IDecorator, new() {
private readonly TDecorator _decorator;
public Grid() {
_decorator = new TDecorator();
}
public TDecorator Decorator { get { return _decorator; } }
}
Run Code Online (Sandbox Code Playgroud)
他们通过调用得到一个网格:
var myGrid = new Grid<MyDecorator>();
Run Code Online (Sandbox Code Playgroud)