如何在不使用“;新的“;关键字
本文关键字:新的 关键字 | 更新日期: 2023-09-27 18:25:28
这可能是一个愚蠢的问题,但我正在开发一个组件,我有一个类的属性如下
public class Grid()
{
..
public IDecorator Decorator { get; set;}
}
我想要的是用户指定他们自己的自定义类,以以下方式实现IDecorator
...BuildGrid(
grid=>{
..
grid.Decorator = [CustomNameSpace].[DecoratorClass]
//as in
grid.Decorator = Com.MyCompany.DivDecorator
..
});
Com。我的公司。DivDecorator实现IDecorator接口。那么,在没有最终用户指定中的"new"关键字的情况下,我该怎么做呢
grid.Decorator = new Com.MyCompany.DivDecorator();
我知道我在这里遗漏了一些关键的c#概念。
感谢
[编辑]
我试图做一些类似于位于的Java DisplayTag库的事情
http://www.displaytag.org/1.2/tut_decorators.html
他们的做法是通过
decorator="org.displaytag.sample.Wrapper"
所以我想不是
public IDecorator Decorator { get; set;}
我应该做
public String Decorator (get; set;}
然后在内部使用TypeOf()来解决它……只是想知道是否有其他方法可以在C#中优雅地完成它。
感谢
您可以使用工厂方法:
public class DivDecorator
{
public static IDecorator Create()
{
return new Com.MyCompany.DivDecorator()
}
}
...
grid.Decorator = Com.MyCompany.DivDecorator.Create();
或者单例:
public class DivDecorator
{
public static readonly IDecorator Instance = new DivDecorator();
}
...
grid.Decorator = Com.MyCompany.DivDecorator.Instance;
在这两种情况下,您只是将new
操作符移动到不同的位置。
或者,您可以让用户指定类型,然后在需要时必须担心实例化它:
public class Grid
{
public Type DecoratorType { get; set; }
private IDecorator CreateDecorator()
{
return (IDecorator)Activator.CreateInstance(this.DecoratorType);
}
}
...
grid.Decorator = typeof(Com.MyCompany.DivDecorator);
或者更好的是,使用泛型:
public class Grid<T> where T : IDecorator, new
{
private T CreateDecorator()
{
return new T();
}
}
BuildGrid<Com.MyCompany.DivDecorator>(grid => ... );
如果我了解您要查找的内容,您可以使用泛型:
public class Grid<TDecorator> where TDecorator : IDecorator, new() {
private readonly TDecorator _decorator;
public Grid() {
_decorator = new TDecorator();
}
public TDecorator Decorator { get { return _decorator; } }
}
他们会打电话给得到一个网格
var myGrid = new Grid<MyDecorator>();
您可以使BuildGrid通用,并指定一个new()约束。
例如BuildGrid<T>() where T : IDecorator, new()
虽然我不是100%清楚你想要什么。
如果你有一个接口,你将在某个地方创建一个实例。您可以注入它(参见IOC模式或实例工厂模式)
有各种各样的场景。但了解工厂模式将有助于
1) 类在程序集中。发现类型获取实现接口的所有类型并创建一个实例http://msdn.microsoft.com/en-us/library/wccyzw83.aspx
2) 代码是外部的,http://msdn.microsoft.com/en-us/library/dd460648.aspx
3) 或文件http://msdn.microsoft.com/en-us/library/system.reflection.assembly.load%28v=vs.110%29.aspx
感谢所有帮助我的人!我决定使用p.s.w.g的Activator。CreateInstance方法。原因是,对于网格组件,我有一个表级的装饰器,然后网格的每一列也可以有自己的装饰器。如
@Model.[MyIEnumberable].BuildGrid<Product>(grid=>{
grid.ShowHeader = false;
grid.CellSpacing = 0;
grid.CellPadding = 0;
grid.Decorator = "Com.MyCompany.DivDecorator";
grid.columns(
grid.column(HeaderText: "First Column", Decorator:"Com.MyCompany.FirstColumnDecorator"...),
grid.column(HeaderText: "Second Column", Decorator:"Com.MyCompany.SecondColumnDecorator"..),
grid.column(HeaderText: "ThirdColumn", Text:@item.ProductID),
grid.column(HeaderText: "ThirdColumn", Text:@item.[A Property only exist in grid.Decorator, achieved using dynamic/DynamicObject])
)
})
因此,考虑到我的情况,并且由于每个列都可能有自己的decorator类。所以我必须使用Activator。为它们创建实例。
再次感谢大家的帮助!!非常感谢您再次光临!!
[编辑]。在阅读了p.s.w.g的最后两条评论之后,泛型方法是可行的!