将类对象列表传递给另一个类

时间:2016-04-04 09:06:31

标签: c#

我正在尝试将类对象的List传递给另一个类,在这种情况下,我要初始化一个表单类并需要发送两个值:

类对象:

public class catData
{
  public string catName;
  public string modGUID;
  public string versionLocal;
  public string versionServer;
  public bool onServer;
}

在Class1中,我有列表,需要在初始化时发送给Class2。

的Class1:

String catExportTXT = "txt";
List<catData> mainCatSet = new List<catData>();

using (var catForm = new Class2(catExportTXT, mainCatSet))
{
  var result = catForm.ShowDialog();
  if (result == System.Windows.Forms.DialogResult.OK)
  {
    localvar = catForm.selectedCats;
  }
  else
  {
    Environment.Exit(0);
  }
}

这里的问题是Class2没有类Object(catData)的定义所以我不能直接将它作为参数发送。

有人可以建议我如何在Class2中定义类对象,以便我可以发送值吗?

非常感谢

2 个答案:

答案 0 :(得分:0)

我不确定你为什么需要这样做但是一个选项是使用一系列动态。

class Program
{
    static void Main(string[] args)
    {
        var c1 = new Class1();
        c1.SendCats();
    }
}
class Class1
{
    public void SendCats()
    {
        var catData = new[]
        {
            new { name = "cat1", version = 1 },
            new { name = "cat2", version = 2 }
        };
        var c2 = new Class2(catData);
    }
}

class Class2
{
    public Class2(dynamic[] catData)
    {
        foreach (var cat in catData)
        {
            Console.WriteLine("{0} {1}", cat.name, cat.version);
        }
    }
}

输出

cat1 1
cat2 2

此外,如果需要,您可以将Cat对象列表转换为动态数组

var catList = new List<Cat>();
catList.Add(new Cat { Name = "cat1", Version = 1 });
catList.Add(new Cat { Name = "cat2", Version = 2 });
var catData = catList.Select(c => new { name = c.Name, version = c.Version }).ToArray();
var c2 = new Class2(catData);

答案 1 :(得分:0)

好的,这个怎么样:

1)创建一个界面以提供可显示的名称。

/// <summary>
/// Provides an interface used to allow selection of an object in the user interface.
/// </summary>
public interface ISelectable : IDisplayName
{
}

2)为可选对象创建一个界面。

public class catData : ISelectable
{
    public string catName;
    public string modGUID;
    public string versionLocal;
    public string versionServer;
    public bool onServer;

    /// <summary>
    /// Gets a name to display in the application to end-users.
    /// </summary>
    public string DisplayName {  get { return catName; } }

    public override string ToString()
    {
        return this.DisplayName;
    }
}

3)分配接口并在catData对象上创建属性。

public partial class Class2<T> : Form where T : ISelectable
{
    private IEnumerable<ISelectable> selectableItems;

    public Class2()
    {
        InitializeComponent();
    }

    public Class2(string exportText, IEnumerable<T> list) : this()
    {
        this.selectableItems = list;
    }

    public T { get; set; }
    public List<T> SelectedItems { get; set; }

    private void Class2_Load(object sender, EventArgs e)
    {
        foreach (ISelectable item in selectableItems)
        {
            //System.Diagnostics.Debug.Print(item.DisplayName);
            System.Diagnostics.Debug.Print(item.ToString());
        }
    }
}

4)Class2表单(有一个示例,但显然缺少核心选择操作)。如果您使用通用列表控件,请考虑在catData中覆盖ToString(),如上所述。

String catExportTXT = "txt";
List<catData> mainCatSet = new List<catData>();

using (var selectForm = new Class2<catData>(catExportTXT, mainCatSet))
{
    var result = selectForm.ShowDialog();
    if (result == System.Windows.Forms.DialogResult.OK)
    {
        var localvar = selectForm.SelectedItem;
    }
    else
    {
        Environment.Exit(0);
    }
}

5)在您的主应用程序中使用如下:

{{1}}

希望这有道理吗?