如何在不使用"new"关键字的情况下发起课程?

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#中执行它.

谢谢

p.s*_*w.g 8

那么你可以使用工厂方法:

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)


Joe*_*nos 5

如果我理解你在寻找什么,你可以使用通用:

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)