繁体   English   中英

C#:类的返回值-还是有更好的方法?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM