2009-09-28 46 views
0

我创建了一个具有List类型成员的类。然后我可以使用ClassNameInstance.Add()加入。C#:类返回值 - 还是有更好的方法吗?

我们现在使用一些来自第三方的代码,它将自动使用我创建的任何类及其值。除了列表。它只返回列表中的第一个元素。

我需要的是一个逗号分隔的版本,而不是第三方代码来使用。现在我可以将字符串附加到字符串成员,但这看起来不如.Add()方法好。

,所以我想创建自己的类,我可以有一个Add()方法,但可以像这样访问它的单个值:

MyClass1.Add("Test1"); 
MyClass1.Add("Test2"); 

Console.WriteLine(MyClass2); 

我想输出是Test1, Test2。我希望这是有道理的!

UPDATE1:

好像上面可能没有明确。

public class MyClass1 
{ 
    ???? 
} 

public class MyClass2 
{ 
    MyClass1 mc1 { get; set; } 
    String name { get; set; } 
} 

第三方代码将使用MyClass2及其分配的值。当我使用List而不是MyClass1时,我只能得到列表中的第一个值,但需要一个CSV列表作为返回的字符串。

MyClass2 mc2 = new MyClass2(); 

mc2.mc1.Add("Test1"); 
mc2.mc1.Add("Test2"); 

Console.WriteLine(mc2.mc1) should output -> Test1, Test2 

希望能够清理一些东西!

谢谢大家! :)

UPDATE2:

似乎每个人都建议同样的事情 - 用toString()方法。

不幸的是,第三方代码会查看我的类,并自动确定成员类型和值。这意味着我无法将代码传递给调用ToString()时返回的值。

我需要列表<>的添加/删除功能>,但将其值作为单个CSV字符串使用时。

+0

答案为止似乎回答你问题的第二部分,但我必须承认,我不是很了解,与第一部分相结合 - 是您的第三方代码也执行的ToString( )在你的班上? – Benjol 2009-09-28 13:52:17

+0

@ Benjol: 我不确定它究竟发生了什么,因为我没有得到源代码(虽然我可以得到它)。 我真的希望我的课堂能够在第二课堂中使用。这第二类将与第三方代码一起使用,所以我不能不幸地使用ToString()。 – neildeadman 2009-09-28 13:57:50

回答

0

不是我想要的答案,但似乎我不能做我想做的。

在我想让我的第二类作为成员的类中,我将该成员设为了一个字符串,以便第三方代码可以按我的意愿工作。

我创建了第二个类,其中有一个List<String>作为公共成员,然后是一个名为.ToCSV()的方法将列表输出为csv字符串。我添加了一个.Add()方法将字符串添加到列表中以保存必须去Class1.Class2.Add()

然后之前的第三方代码会用我的课,我做的:

MyClass1.MyString = MyClass2.ToCSV(); 

因此给我基本上是我在周围的方式想!

感谢大家的意见和帮助!

尼尔

8

我不知道,你需要一个额外的类在这里:

public sealed class StringJoiningList 
{ 
    private readonly List<string> list = new List<string>(); 

    public void Add(string item) 
    { 
     list.Add(item); 
    } 

    public override string ToString() 
    { 
     return string.Join(", ", list.ToArray()); 
    } 
} 

List<string> list = new List<string>(); 
list.Add("Test1"); 
list.Add("Test2"); 
Console.WriteLine(string.Join(", ", list.ToArray()); 

可以一类只是为了得到它ToString自动调用包装这一行为现在假设你只想要一个List<string> - 它也不允许你访问项目其他ToString()方法。所有这些都是可以修复的,如果你能提供更多的信息。您可能甚至只是从List<T>得出:

public class StringJoiningList<T> : List<T> 
{ 
    public override string ToString() 
    { 
     return string.Join(", ", this.Select(x => x.ToString()).ToArray()); 
    } 
} 

我不能完全肯定我喜欢这个主意,但它取决于你需要做什么?

+0

我无法使用ToString,因为第三方代码只是传递了一个Class名称(即上面编辑的原始问题中的MyClass2),并计算出它的类型并使用它的值。 – neildeadman 2009-09-28 14:10:14

+0

如果你使用上面的任何一个类作为'MyClass1',你的测试用例将会工作,因为Console.WriteLine会自己调用ToString。如果你的第三方课程没有,我们需要知道它做了什么。 – 2009-09-28 14:19:44

+0

我尝试了上面的类,他们确实与Console.WriteLine一起工作,但遗憾的是与我的第三方代码不起作用。 – neildeadman 2009-09-28 14:44:16

1

有几个简单的选项可以覆盖您的类的ToString()方法(以便当它在此上下文中使用时返回逗号分隔的项目列表),或者您可以提供一个属性,名单。

0

最简单的解决方案可能是继承自StringCollection类并重写ToString。否则这个班级已经有你所问的一切。

public class MyClass : System.Collections.Specialized.StringCollection 
{ 
    public override string ToString() 
    { 
     var c = new string[this.Count]; 
     this.CopyTo(c,0); 
     return string.Join(",", c); 

    } 
} 

然后,您可以像使用之前一样使用它。对于这种简单的用法,不需要使用泛型。

编辑:

类本身没有返回值,所以第三方代码必须阅读性能。你应该能够如上所述重写ToString(),然后公开一个返回ToString()的属性。这很可能会令该字符串值可见的第三方代码

public class MyClass : System.Collections.Specialized.StringCollection 
{ 
    public string MyValue 
    { 
     get { return this.ToString(); } 
    } 

    public override string ToString() 
    { 
     var c = new string[this.Count]; 
     this.CopyTo(c,0); 
     return string.Join(",", c); 

    } 
} 
+0

除非调用第三方代码,否则这将起作用,我将它传递给包含此类的类的实例。它不会使用ToString,因为它会自动处理类。 我已经用更好的描述编辑了我的原始问题。 – neildeadman 2009-09-28 14:18:38

+0

我已经调整了上面的答案。我仍然认为这个机制可以解决你的问题。 – 2009-09-30 12:32:48

0

下面是一个扩展我写信给参加一个IEnumerable < T中的物品>

 
public static string Join<T>(this IEnumerable<T> collection, 
          string separator, Func<T, object> selector) 
{ 
    if (null == separator) 
     throw new ArgumentException("separator"); 
    if (null == selector) 
     throw new ArgumentException("selector"); 

    Func func = item => 
    { 
     var @object = selector(item); 
     return (null != @object) ? @object.ToString() : string.Empty; 
    }; 
    return string.Join(separator, collection.Select(func).ToArray()); 
} 

它可以像这样使用:

 
List<Person> list = new List<Person>() 
{ 
    new Person() { FirstName = "Magic", LastName = "Johnson" }, 
    new Person() { FirstName = "Michael", LastName = "Jordon" }, 
    new Person() { FirstName = "Larry", LastName = "Bird" } 
}; 

var value = list.Join(", ", p => p.FirstName); 

// value is "Magic, Michael, Larry"