c#中不同类型的通用列表

时间:2010-02-25 15:01:12

标签: c# generics

我想构建一个表单实体,它应该包含表单表单字段

所以:我希望有一个看起来像这样的类:

public abstract class form {
public string FormName;
public IList<FormField> Fields;
}

我希望我的FormField类有一个方法:getValue。

但是,我希望它是通用的,所以getValue不会返回Object而是返回对象的实际值。

5 个答案:

答案 0 :(得分:3)

这将有效:

public abstract class Form<T>{
  public string FormName;
  public IList<IFormField> Fields;
}

public class FormField<T> : IFormField{
    public T getValue() { return default(T); }

    object IFormField.getValue() {  
        return this.getValue();
    }
}

public interface IFormField { 
      object getValue();
}

答案 1 :(得分:3)

不幸的是,没有办法创建一个包含对象的通用列表,每个对象都有一个给定方法的不同返回类型,就像你想要的那样。

您可以做的最好的事情是接口或基类,以及返回Object的方法。

这意味着你必须施展,但是,无论如何,你必须这样做。

如果您可以使用不同的返回类型,此代码将如何工作:

FormField f = _Fields[0];
?? x = f.GetValue();

答案 2 :(得分:1)


public abstract class Form<T>{
  public string FormName;
  public IList<FormField<T>> Fields;
}

public class FormField<T>{
  public T getValue { ... code here ...  }
}

答案 3 :(得分:1)

public abstract class Form {
    public IList<FormField> Fields;
    public string FormName;
}

public class FormField {
    private Object field;

    public T getValue<T>() {
        return (T) field;
    }
}

答案 4 :(得分:1)

请参阅下面的完整代码。我的解决方案就像:

var myForm = new Form();
var int_value = myForm.Fields
           .OfType<IntegerFormField>()
           .First(c => c.Name == "c1").GetValue();
var decimal_value = myForm.Fields
           .OfType<DecimalFormField>()
           .First(c => c.Name == "c2").GetValue();

字段接口:

    public interface IFormField
    {
        object GetValue();
        string Name { get; }
    }

    public interface IFormField<T> : IFormField
    {
        T GetValue();

    }

所有表单字段的抽象基类:

abstract class FormFieldBase<T> : IFormField<T>
        {
            private readonly T _value;

            public FormFieldBase(T value, string name)
            {
                _value = value;
                Name = name;
            }

            #region IFormField<T> Members

            public virtual T GetValue()
            {
                return _value;
            }

            #endregion

            #region IFormField Members

            object IFormField.GetValue()
            {
                return _value;
            }

            public string Name { get; private set; }

            #endregion
        }

两个示例表单字段实现:

class IntegerFormField : FormFieldBase<int>
{
     public IntegerFormField(int value, string name) : base(value, name) { }
}

class DecimalFormField : FormFieldBase<decimal>
{
     public DecimalFormField(Decimal value, string name) : base(value, name) { }
}

表格类:

class Form
    {
        public IList<IFormField> Fields
        {
            get
            {
                return new List<IFormField>(){
                        new IntegerFormField(10, "c1"), 
new DecimalFormField(200, "c2")
                 };
            }
        }
    }

HTH