【问题标题】:Insert object into value with different base type (inherited) c#将对象插入到具有不同基类型(继承)的值中 c#
【发布时间】:2025-12-25 23:15:11
【问题描述】:

所以我有一个类型为SvgElement 的对象,它包含一个值SvgPath(继承SvgElement)。这是代码。

SvgElement createdElement;
//other operations. createdElement now has other data of SvgPath

if (createdElement.GetType() == typeof(SvgPath) & createdElement.ElementName == "path" && storedValue != "")
 createdElement.PathData = SvgPathBuilder.Parse(storedValue);

return createdElement

(注意:这是统一完成的,必须考虑 .net 2.0,因为 Unity 会冒犯 System.Linq)

现在SvgPathBuilder.Parse 接受string 并将SvgPathSegmentList 类型的对象返回到PathDataPathData 通常是SvgPath 中的一个变量,但我修改了SvgElement 以暂时取该值,这样我就知道我正在测试的其他东西是否可以工作。

现在我已经为您提供了背景信息..我如何(通用代码-Type T 的东西)编写它以便SvgPathBuilder.Parse 将存储在 SvgPath.PathData 而不是继承的基础 SvgElement 的 PathData 中?

(不确定标题是否适合问题,请告知)

【问题讨论】:

  • 选角怎么样:(createdElement as SvgPath).PathData = SvgPathBuilder.Parse(storedValue);
  • 有效。你应该得到一块饼干。
  • 您在谈论泛型,并解决了简单的强制转换,但还是进行了 Null 引用检查,这在这种情况下是最可能的问题。如果没有分配有效的内存/初始化,那么就会出现Null引用异常
  • @MrinalKamboj 我不确定一个简单的泛型方法是否可以在类内部发挥作用。此外,storedvalue 已初始化,因此即使应该去那里的值没有,它也会返回一个空的 SvgPathSegmentList。
  • 好的,将其发布为答案 :)

标签: c# generics .net-2.0


【解决方案1】:

您可以将元素转换为 SvgPath: (createdElement as SvgPath).PathData = SvgPathBuilder.Parse‌​(storedValue);

【讨论】:

  • 这是一个简单的解决方案,可以解决一直困扰我的整体问题。谢谢。
【解决方案2】:

从单纯的描述中不太清楚你想要实现什么,但考虑以下设计,仍然需要进一步更改以适应确切的要求

重要细节:

  • SvgElement 使用需要由 Child 实现的抽象属性进行抽象,即 SvgPath
  • TestSVG 中使用的通用约束确保我们始终提供正确的类或其派生版本,在此类中您可以实现属性 PathData 的填充

        public abstract class SvgElement
        {
          public abstract List<SvgPath> PathData { get; set;}
        }
    
        public class SvgPath : SvgElement
        {
          public override List<SvgPath> PathData { get; set;}       
        }
    
        public class TestSvg<T> where T:SvgElement
        {
    
        }
    

【讨论】:

  • 这不是我现在要寻找的,因为我只是对代码进行临时操纵,但是当我回来重写代码时,这将很有用。谢谢。
  • 这需要根据具体用例进一步即兴发挥,目前这是一个粗略的格式,基于我对问题的理解
  • 对于造成的误解,我深表歉意,我已经为此工作了一段时间(它的其他部分)并且需要一个刚刚修复的修复程序。我的这个项目用了太多周了..