引用(List <someclass>)someObject

时间:2017-11-14 05:57:04

标签: c# generics ienumerable data-processing

尝试了一些搜索。可能是我缺乏知识,我没有使用正确的搜索术语,或者可能只是不理解答案。

我有一个传递对象的方法,我想将特定值输出到文本文件。 我已经知道该对象将是 List&lt; someClass&gt; 的几个不同的可能类(客户/员工/项目等)。但是所有类都包含相同的字符串属性(例如) string idNumber

这样的事情:

public static void OutputFile(object myInput)
{
  foreach (someGenericObject in (List<anyType>)myInput)
  {
    string textToOutput = someGenericObject.idNUmber; 
    //output the text to somewhere else here
  }
}

我觉得只要我知道它总会包含这个&#34; idNumber&#34;属性不管类型,我应该能够以某种方式引用它。但我似乎无法理解它?

我通常得到的错误是:

  

无法投射List&lt;员工&gt;列出&lt;对象&gt;等

提前致谢

4 个答案:

答案 0 :(得分:1)

正如我在评论中所建议的那样,如果您能够修改这些类,则可以让它们都从具有IHasIdNumber属性的接口idNumber继承。

您的方法将成为:

public static void OutputFile(IEnumerable<IHasIdNumber> myInput)
{
  foreach (var item in myInput)
  {
    string textToOutput = item.idNUmber; 
    //output the text to somewhere else here
  }
}

答案 1 :(得分:1)

有几种方法可以解决这个问题。

推荐方式:实施通用界面:

SELECT cp.* 
FROM `carparks` cp
LEFT JOIN `clients` cl ON cp.`carpark_id` = cl.`carpark_id` 
LEFT JOIN `cars` c ON cl.`client_id` = c.`client_id` 
WHERE cp.`carpark_id` IN (1, 3, 8, 33, 34, 38, 39) 
GROUP BY cp.`carpark_id`
ORDER BY MAX(c.`created_at`) DESC

然后,可以传递给方法的所有可能类都将实现public interface INumberable { // I'm sure you can come up with a better name... string IDNumber { get; set; } } 。您的方法可以如下所示:

INumberable

不推荐的方式:反思:

public static void OutputFile(List<INumerable> myInput)
{
  foreach (var someGenericObject in myInput)
  {
    string textToOutput = someGenericObject.idNUmber; 
    //output the text to somewhere else here
  }
}

请注意,这不是很安全。

答案 2 :(得分:-1)

您可以使用[动态]。

Match match = Regex.Match("https://any-any.test.test2.com", "(http(s)?://)?.+-.+\.test.test2.com", RegexOptions.IgnoreCase);

if (match.Success) {
    Console.WriteLine("OK");
}

答案 3 :(得分:-2)

如果所有类都具有您想要在foreach循环中访问的相同属性,则可以在via界面中进行。

public interface ISmth {
        int MyProperty { get; set; }
    }

    public class Student : ISmth {
        public int MyProperty { get;  set; }
    }

    public class Employee : ISmth {
        public int MyProperty { get; set; }
    }

public static void DoSmth(object myObj) {
        foreach(ISmth item in (List<object>)myObj) {
            Console.Write(item.MyProperty);
        }
    }


List<Student> stdList = new List<Student>();

DoSmth(stdList.Cast<object>().ToList());