代码之家  ›  专栏  ›  技术社区  ›  MindFold

c中不同类型的泛型列表#

  •  2
  • MindFold  · 技术社区  · 14 年前

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

    我想要我的 FormField getValue ,但我希望它是通用的,所以 获取值

    5 回复  |  直到 5 年前
        1
  •  3
  •   Lasse V. Karlsen    14 年前

    不幸的是,无法创建一个包含对象的单一泛型列表,每个对象对于给定的方法都有不同的返回类型,就像您想要的那样。

    最好是一个接口或基类,以及一个返回Object的方法。

    如果可以有不同的返回类型,那么此代码将如何工作:

    FormField f = _Fields[0];
    ?? x = f.GetValue();
    
        2
  •  3
  •   recursive    14 年前

    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();
    }
    
        3
  •  1
  •   Derick Bailey    14 年前
    
    public abstract class Form<T>{
      public string FormName;
      public IList<FormField<T>> Fields;
    }
    
    public class FormField<T>{
      public T getValue { ... code here ...  }
    }
    
        4
  •  1
  •   AndreyAkinshin    14 年前
    public abstract class Form {
        public IList<FormField> Fields;
        public string FormName;
    }
    
    public class FormField {
        private Object field;
    
        public T getValue<T>() {
            return (T) field;
        }
    }
    
        5
  •  1
  •   Sunny    14 年前

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

    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公司