如何在不使用“;新的“;关键字

本文关键字:新的 关键字 | 更新日期: 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的最后两条评论之后,泛型方法是可行的!