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

Mat*_*lay 3 .net c# 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;
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 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>();
}
Run Code Online (Sandbox Code Playgroud)

T是通用型参数; 我们想要创建的类型.该where说"它必须是HolePattern或子类型,它必须有一个公共的无参数构造函数" -这让我们用new T()创建它的一个新的实例,并访问所有成员HolePattern对这样的情况下(如PatternName).这也允许我们调用接受a HolePattern作为参数的方法.