[英]C#: Class return value - or is there a better way?
我创建了一个具有List类型成员的类。 然后,我可以使用ClassNameInstance.Add()
将其添加到其中。
现在,我们正在使用来自第三方的一些代码,这些代码将自动使用我创建的任何类及其值。 除清单外。 它仅返回列表中的第一个元素。
我需要的是返回的逗号分隔版本,供此第三方代码使用。 现在,我可以将Strings追加到String成员,但这看起来不如.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列表作为返回的String。
MyClass2 mc2 = new MyClass2();
mc2.mc1.Add("Test1");
mc2.mc1.Add("Test2");
Console.WriteLine(mc2.mc1) should output -> Test1, Test2
希望能进一步解决问题!
感谢大家! :)
UPDATE2:
似乎每个人都在建议同一件事-使用ToString()。
不幸的是,第三方代码将查看我的班级并自动确定成员的类型和值。 这意味着我无法将调用ToString()返回的值传递给代码。
我有点需要List <>的添加/删除功能,但是使用它时,其值将作为单个CSV字符串返回。
我不确定这里是否需要额外的课程:
List<string> list = new List<string>();
list.Add("Test1");
list.Add("Test2");
Console.WriteLine(string.Join(", ", list.ToArray());
您可以将此行为包装在一个类中,只是为了使其在ToString
上自动被调用:
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>
-除了ToString()
方法之外,它也不允许您访问其他项。 如果您可以提供更多信息,那么所有这些当然都是可以修复的。 你甚至可以从刚刚获得List<T>
public class StringJoiningList<T> : List<T>
{
public override string ToString()
{
return string.Join(", ", this.Select(x => x.ToString()).ToArray());
}
}
我不确定自己是否喜欢这个主意,但这取决于您需要执行的操作...
几个简单的选择将是重写类的ToString()方法(以便在此上下文中使用它时,它返回以逗号分隔的项目列表),或者您可以提供一个使列表变平的属性。
您需要实现ToString方法。
最简单的解决方案可能是从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);
}
}
这是我写的将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"
并不是我想要的答案,但似乎我做不到自己想要的。
在我想让第二堂课成为成员的班级中,我将该成员设置为String,以便第三方代码可以按我的意愿工作。
我创建了第二个类,该类具有List<String>
作为公共成员,然后创建了一个名为.ToCSV()
的方法,以将列表输出为csv字符串。 我添加了.Add()
方法以将字符串添加到列表中,以省去Class1.Class2.Add()
。
然后在第三方代码使用我的类之前,我做了:
MyClass1.MyString = MyClass2.ToCSV();
因此基本上给了我我想要的东西!
感谢大家的投入和帮助!
尼尔
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.