【问题标题】:C#: Why does my string return object type and not the value it contains?C#:为什么我的字符串返回对象类型而不是它包含的值?
【发布时间】:2021-11-19 10:29:43
【问题描述】:

我正在循环通过 List,并尝试将其中一个属性实例化为字符串,但它返回类型:

{Namespace.Collection}

如果我设置一个断点,我可以看到它拥有我需要的值。

如何让它返回值而不是类型?

foreach (var PropertyName in ListName) {
    string n = PropertyName.ToString();
}

更新(添加了更多我的代码,以及尝试实施建议的解决方案):

foreach (DataRow dr in ds.Tables[0].Rows) {

//PaidTrips is my ObservableCollection instance.
//PaidTrip is my holder class which it has been bound to.

                        PaidTrips.Add(new PaidTrip {

                            LicenseHolderID = dr[0].ToString(),
                            // adding more properties
                        });

                        List<PaidTrip> theseTrips = PaidTrips
                            .GroupBy(p => new { p.LicenseHolderID })
                            .Select(g => g.First())
                            .ToList();
                       
                        foreach (PaidTrip PaidTrips in theseTrips) {

                            foreach (var LicenseHolderID in PaidTrips.GetType().GetProperties()) {

                                string n = LicenseHolderID.GetValue(PaidTrips).ToString();

// code to create PDF
}

gfx.DrawString(n, new XFont("Arial", 40, XFontStyle.Bold), ridelGreen, new XPoint(40, 350));

这就是我对string n 所做的事情。但是创建PDF时,字符串输出是System.Action1[System.Action]`

我做错了什么?

【问题讨论】:

  • ListName的类型是什么,怎么定义的?
  • string n = PropertyName.GetType().ToString(); 在这种情况下n 的值是多少?
  • @TheGeneral 列表是这样的:List&lt;ClassName&gt; listName = ListName .GroupBy(p =&gt; new { p.PropertyName}) .Select(g =&gt; g.First() .ToList(); 其中ListNameObservableCollection
  • @mjwills n 的值仍然是 {Namespace.ListName} 。 “ListName”是ObservableCollection 的名称,我基于List

标签: c# string list types foreach


【解决方案1】:

在遍历列表后,您需要遍历自定义类中的属性类型。首先我们需要一个额外的循环——遍历 ListName 列表中的每个 ClassName 对象。

            foreach (ClassName myObj in ListName)
            {
                foreach (var PropertyName in myObj.GetType().GetProperties())
                {
                    string n = PropertyName.GetValue(myObj).ToString();
                }
            }

那么我们需要循环当前循环的ClassName对象的实际属性。

然后您传递参数 .GetValue(因为您现在正在遍历属性 - 实际分配的属性,而不是属性的定义)。

之后,您仍然需要指定您想要的值的对象。因此,通过传递 myObj,您指定了 ListName 当前循环的 ClassName->Property。

编辑:


            List<Notes> myNotesNow = new List<Notes>();

            myNotesNow.Add(new Notes
            {
                note1 = "Valuye"
                // adding more properties
            });

            List<Notes> theseTrips = myNotesNow;

            foreach (Notes PaidTrips in theseTrips)
            {

                foreach (var myVariable in PaidTrips.GetType().GetProperties())
                {

                    string n = myVariable.GetValue(PaidTrips).ToString();

                    string forBreakPoint = "";
                    // code to create PDF
                }

            }

【讨论】:

  • 你好@Novorfay,谢谢!我很欣赏,这很有趣。我可能做错了什么,当我尝试使用该字符串时,这给了我System.Action1[System.Action] 的输出。 myObj 你引用的那是我的ObservableCollection 的名字对吧?我只是将创建 PDF 的代码直接放入最后一个 foreach
  • 你能告诉我完整的用法吗?也许编辑您的 OP,以便我们都能看到它 - 您在哪里声明了变量,然后您是如何尝试使用该值的?很难像这样完全理解。 @OleM
  • 我明白了,我会更新我的问题。谢谢!
  • @OleM 编辑了我的答案-但是我传递给您的代码对我有用-我更改了您的课程并放入了我的课程(因为我无权访问您的 PaidClass-不知道它是什么变量有) - 但是当我在字符串 forBreakPoint 上设置断点时,我可以验证在循环中,字符串 n 实际上具有正确的值。将 dr[0].ToString() 更改为固定值以进行测试 - 您确定从中获得值吗?
  • 你是对的 - 我已经通过断点浏览了所有代码,并且正确的值被带到了这一切,哈哈。但是 PDF 仍然以 {System.Action1[System.Action] 作为文本结束,就在现在,它以来自其他列之一的十进制值结束,而我没有更改任何内容。当我将字符串传递给MessageBox.Show 时,它确实传递了正确的值。困惑..如果您没有任何其他想法,我将您的解决方案标记为已接受,并创建一个针对我的 PDF 方法的新问题,我认为...
【解决方案2】:

对于您的问题 - 我猜 ListName 不是 string 类型,因此您会得到预期的行为(请参阅:https://docs.microsoft.com/en-us/dotnet/api/system.object.tostring?view=net-5.0#the-default-objecttostring-method

在这种情况下,您可以覆盖该对象的 ToString() 函数以返回您需要的任何内容,如下所示:

   public override string ToString()
   {
      return "whatever you want including class properties";
   }

另一方面,C# 中变量命名的一般方法是驼峰式命名,并以小写开头,因此我建议将变量命名为 propertName 而不是 PropertyNamelistName 而不是 ListName

此外 - 命名变量的实现方式 (ListName) 不是最佳实践,因为它将它们绑定在一起,不允许在实现更改的情况下灵活(该评论只有在有意义的情况下才是正确的,因为我没有看到所有代码)

干杯

【讨论】:

  • 您好,谢谢!努力实现这一点。我正在尝试在方法中获取字符串值,因此我不确定如何访问 override ToString() 方法。是否可以从我的方法中实现相同的功能?另外,您能否举例说明您在退货行中所写的内容。我会返回propertyName吗?
  • 嗨!需要更多数据才能提供帮助。对象 PropertyName 到底是什么?它是您或其他方创建的类的实例化吗?
  • 感谢您的跟进。 PropertyName 是我的持有人类MyClass 中的字符串类型属性,绑定到ObservableCollection,我又列出了它。它填充了来自 SQL 数据库列的字符串值。
  • 如果我理解正确,PropertyName 是字符串列表(List&lt;string&gt;)?这可以解释为什么打印的字符串是{Namespace.Collection}
  • 嗯,是的,这是有道理的。它确实是一个字符串列表,我正在尝试(使用 foreach 循环)来获取该字符串的特定实例。 (我实际上是在创建发票,并且需要每个 PropertyName 的字符串值,以便我可以为每个 PropertyName 实例制作一张发票 ..
猜你喜欢
  • 2012-08-25
  • 2011-08-15
  • 1970-01-01
  • 2016-05-29
  • 1970-01-01
  • 2019-04-17
  • 1970-01-01
  • 1970-01-01
  • 2021-01-06
相关资源
最近更新 更多