如何传递对象类MyForm属性列表ClassN?(ClassN没有基类或接口)。作为类的对象MyForm将能够访问成员ClassN?
目的:在ListView(或ObjectListView或其他)上显示来自不同来源的表单信息,自动确定列数(具有属性的公共属性(在下面的示例中,未指定))。当课程一个时,我使用了:
private void MyForm_Load(object sender, EventArgs e)
{
BrightIdeasSoftware.Generator.GenerateColumns(this.olv, typeof(Class1));
}
如何实现这样的通用?
class Program
{
static void Main(string[] args)
{
List<Class1> list1 = new List<Class1>();
list1.Add(new Class1(1, "Word"));
list1.Add(new Class1(2, "Excel"));
list1.Add(new Class1(3, "Access"));
List<Class2> list2 = new List<Class2>();
list2.Add(new Class2(10, "Jhon", "City1"));
list2.Add(new Class2(15, "Ruby", "City2"));
list2.Add(new Class2(20, "William", "City3"));
MyForm form = new MyForm();
form.SetData(list1); // ?
}
}
class MyForm
{
List<T> data = // ?
public void SetData<T>(List<T> data)
{
this.data = data; // ?
}
}
class Class1
{
public int ID { get; set; }
public string Name { get; set; }
public Class1(int id, string name)
{
ID = id;
Name = name;
}
}
class Class2
{
public int Num { get; set; }
public string Name { get; set; }
public string Address { get; set; }
public Class2(int num, string name, string address)
{
Num = num;
Name = name;
Address = address;
}
}
答案 0 :(得分:0)
目前还不是很清楚你在问什么。但是,如果您的意思是您目前拥有专门用于处理MyForm
的类Class1
,现在您希望扩展该类,以便它可以处理Class1
和{{1你可能需要两个不同的表单类。
您已声明Class2
和Class1
是完全独立的类,没有公共基类或接口。鉴于此,没有多态方式让一些代码对两个不同类的实例进行操作。 (如果您关心的只是Class2
属性,那么两个类中都存在一个成员,Name
可能适合您。)
为了最大限度地减少额外工作,您可以创建一个通用基类来处理非特定于dynamic
和Class1
的所有内容。 E.g:
Class2
在每个派生类中,您将实现特定于partial class MyForm<T> : Form
{
List<T> data;
public void SetData<T>(List<T> data)
{
this.data = data;
}
}
partial class MyClass1Form : MyForm<Class1> { ... }
partial class MyClass2Form : MyForm<Class2> { ... }
或Class1
的每个代码。
但请注意,Visual Studio Winforms Designer无法处理具有通用基类的类。
有可能你不是抽象Class2
子类本身,而是抽象数据的访问器/处理程序,这样可以使用单个Form
类而不会混淆Designer,但是仍然可以使用多种数据类型。但是如果你的问题没有更多的背景,就不可能肯定地说出它的样子。它完全取决于MyForm
实际使用传入列表的方式。