我想构建一个表单实体,它应该包含表单表单字段
所以:我希望有一个看起来像这样的类:
public abstract class form {
public string FormName;
public IList<FormField> Fields;
}
我希望我的FormField类有一个方法:getValue。
但是,我希望它是通用的,所以getValue不会返回Object而是返回对象的实际值。
答案 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