无需大量投射即可创建和初始化不同的子类型

时间:2009-02-25 05:58:14

标签: c# .net generics

我肯定会在下面的代码中乱搞很多等等。似乎应该有一个更顺畅的方式。我基本上试图使用构建器方法(CreateNewPattern)来处理创建传递的子类类型的新对象(通过CreateNewCircularPattern和CreateNewLinePattern方法)。我目前只有两个子类型的CircularHolePattern和SingleLineHolePattern继承自HolePattern,但我希望随着我的应用程序的增长有更多。

这是一个使用委托或lambda的地方吗?它对它们一无所知,所以请尽可能具体和代码建议。

private CircularHolePattern CreateNewCircularPattern()
{
   var CreatedPattern = CreateNewPattern(typeof(CircularHolePattern));
   return (CircularHolePattern)CreatedPattern;
}


private SingleLineHolePattern CreateNewLinePattern()
{
   var CreatedPattern=CreateNewPattern(typeof(SingleLineHolePattern));
   return (SingleLineHolePattern)CreatedPattern;
}

private HolePattern CreateNewPattern(Type PatternTypeToCreate)
{
    var NewHolePattern = (HolePattern)Activator.CreateInstance(PatternTypeToCreate);
    NewHolePattern.PatternName = "Pattern #" + (HolePatterns.Count + 1).ToString();
    this.AddPattern(NewHolePattern);
    this.SetActivePattern(NewHolePattern);
    return NewHolePattern;
}

2 个答案:

答案 0 :(得分:6)

我怀疑你想要泛型:

private T CreateNewPattern<T>() where T : HolePattern, new()
{
    var newHolePattern = new T();
    newHolePattern.PatternName = "Pattern #" +
        (HolePatterns.Count + 1).ToString();
    this.AddPattern(newHolePattern);
    this.SetActivePattern(newHolePattern);
    return newHolePattern;          
}

private SingleLineHolePattern CreateNewLinePattern() {
    return CreateNewPattern<SingleLineHolePattern>();
}

private CircularHolePattern CreateNewCircularPattern() {
    return CreateNewPattern<CircularHolePattern>();
}

T是泛型类型参数;我们想要创建的类型。 where表示“它必须是HolePattern或子类型,并且它必须具有公共无参数构造函数” - 这允许我们使用new T()创建它的新实例,并且根据此类实例(例如HolePattern)访问PatternName的所有成员。这也允许我们调用接受HolePattern作为参数的方法。

答案 1 :(得分:0)

首先,您可以将Create ... Pattern方法缩小为

private CircularHolePattern CreateNewCircularPattern()
{
   return CreateNewPattern(typeof(CircularHolePattern));
}

另一个建议可能是仅在抽象中工作。例如,仅从Create ... Pattern方法返回HolePattern类型,而不是它们的具体类型,如CircularHolePattern。在任何情况下,您都将它们转移到HolePattern。

因此,CreateNewCircularPattern变为

private HolePattern CreateNewCircularPattern()
{
   return CreateNewPattern(typeof(CircularHolePattern));
}