我正在为第三方javascript网格组件创建一个html.helper。我正在通过我的gridextension我的viewmodel。
在我的viewmodel类中,我的属性上有自定义属性,描述了每列的显示方式。
在我的gridextension中,我想在我的CreateSerializedRow方法中序列化我的T.类,我希望能够做类似行的事情。 < - 并为我的班级获得intellisense。但如何在没有明确演员的情况下为T级成员提供intellisense?
public class GridData<T>
{
#region Fields
private List<Dictionary<string, object[]>> _attributes;
private static IList<T> _dataSource;
#endregion
#region Properties
public string Align { get; set; }
public string Header { get; set; }
public string JsonData { get; set; }
public string Sorting { get; set; }
public string Width { get; set; }
#endregion
#region Public Methods
public void Serialize(IList<T> dataSource, List<Dictionary<string, object[]>> attributes)
{
_dataSource = dataSource;
_attributes = attributes;
JsonData = _dataSource.Count == 0 ? string.Empty : BuildJson();
}
#endregion
#region Private Methods
private static string BuildJson()
{
var sbJson = new StringBuilder();
var listCount = _dataSource.Count;
sbJson.Append("{page: 1, total:" + listCount + ", rows: [");
for (var i = 0; i < listCount; i++)
{
var serialized = CreateSerializedRow(i);
sbJson.Append(serialized);
if (i < listCount - 1)
sbJson.Append(",");
}
sbJson.Append("]}");
return sbJson.ToString();
}
private static string CreateSerializedRow(int index)
{
var row = _dataSource[index];
var sb = new StringBuilder();
//sb.Append("{id:'" + Id + "',data:[");
//sb.Append(String.Format("'{0}',", GroupName.RemoveSpecialChars()));
//sb.Append(String.Format("'{0}',", Description));
//sb.Append(String.Format("'{0}',", CreatedBy));
//sb.Append(String.Format("'{0}',", CreatedDate.ToShortDateString()));
//sb.Append(String.Format("'{0}',", EmailSubject.RemoveSpecialChars()));
//sb.Append(String.Format("'{0}',", EmailBody));
//sb.Append(String.Format("'{0}',", UpdatedBy));
//sb.Append(String.Format("'{0}'", UpdatedDate.ToShortDateString()));
//sb.Append("]}");
return sb.ToString();
}
#endregion
}
答案 0 :(得分:4)
您可以做的最好的事情是使用通用约束,它指定T必须可转换为特定类型。有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms379564(VS.80).aspx#csharp_generics_topic4。
语法或多或少如下:
public class MyClass<T> where T : ISomethingOrOther
{
}
至少这样,您可以使用Intellisense支持将T限制为接口类型和代码以防止该抽象。
答案 1 :(得分:1)
根据你要做的事情,你可能不得不使用反射循环遍历属性并输出值。最好不要将GridData作为抽象类,并覆盖为每个数据类输出数据行的方法。
或创建一个通用接口,该接口具有Serialize()方法,该方法以预期格式输出对象值的字符串。让每个模型类实现此接口,然后将GridData类约束到此接口。假设这些是ViewModel类,它应该是一个合理的设计。
答案 2 :(得分:0)
如果T总是一个已知的界面或类,你可以这样做:
public class GridData<T>
where T:MyClass
{
...
}