c# - 无需大量转换即可创建和初始化不同的子类型

标签 c# .net generics

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

这是使用委托(delegate)或 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;
}

最佳答案

我怀疑你想要泛型:

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 或一个子类型,并且它必须有一个公共(public)无参数构造函数”——这让我们可以使用 new T() 创建它的一个新实例,并针对这些实例(例如 PatternName)访问 HolePattern 的所有成员。这也允许我们调用接受 HolePattern 作为参数的方法。

关于c# - 无需大量转换即可创建和初始化不同的子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/584871/

相关文章:

java - 为什么 Java 不允许基于类型参数的重载?

java - map 与泛型的递归合并

c# - 服务器-客户端推/拉连接如何工作?

.NET 优化埃拉托色尼 F# 筛法

c# - .NET 4.0 中的 Response.Redirect

.net - 使用 .Net 确定用户是否属于特定的 AD 组

c# - 在 Windows 窗体上获取和显示网络信号强度

c# - 解析字符串 C#(可能使用正则表达式)

C# - 在哪里放置接口(interface)扩展?

c# - 如何知道类型参数是否是动态的?