通用类型的集合

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)


Jon*_*eet 6

创建一个非通用接口或基类,这可能包括一切FormField确实除了特定类型的比特.那你就可以了ICollection<IFormField>.显然,就所使用的字段类型而言,您将无法以强类型方式使用它 - 但您可以使用它的所有非类型特定位(例如名称和形式).