Ben*_*Ben 6 c# generics collections interface
我有一个对象(窗体),其中包含一个集合(.Fields),我想包含一个泛型类(FormField)的实例.
简单地说,FormField定义如下:
public class FormField<T>
{
private Form Form;
public T Value { get; set; }
public string Name { get; set; }
public void Process()
{
// do something
}
public FormField(Form form, string name, T value)
{
this.Name = name;
this.Value = value;
this.Form = form;
}
}
Run Code Online (Sandbox Code Playgroud)
这允许我有FormField,FormField等,这部分很有用.我想要的是一个"Formfields"的集合,无论其类型如何,但我被迫定义一个类型(似乎),例如:
public class Form
{
string Code { get; set; }
string Title { get; set; }
int Year { get; set; }
Guid ClientID { get; set; }
ICollection<FormField<int>> Fields { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想,我想要的是一个接口,它允许我抽象类型信息,从而输入集合作为实例(例如)IFormField而不是FormField <>
但是如果没有在界面中强烈输入集合,我无法看到如何定义它...
任何帮助(包括任何替代解决方案!)将不胜感激!
谢谢,本
Tho*_*que 11
以下是完成Jon答案的一些代码:
public interface IFormField
{
string Name { get; set; }
object Value { get; set; }
}
public class FormField<T> : IFormField
{
private Form Form;
public T Value { get; set; }
public string Name { get; set; }
public void Process()
{
// do something
}
public FormField(Form form, string name, T value)
{
this.Name = name;
this.Value = value;
this.Form = form;
}
// Explicit implementation of IFormField.Value
object IFormField.Value
{
get { return this.Value; }
set { this.Value = (T)value; }
}
}
Run Code Online (Sandbox Code Playgroud)
并以您的形式:
ICollection<IFormField> Fields { get; set; }
Run Code Online (Sandbox Code Playgroud)
创建一个非通用接口或基类,这可能包括一切FormField确实除了特定类型的比特.那你就可以了ICollection<IFormField>.显然,就所使用的字段类型而言,您将无法以强类型方式使用它 - 但您可以使用它的所有非类型特定位(例如名称和形式).
| 归档时间: |
|
| 查看次数: |
6236 次 |
| 最近记录: |