我如何获得<t>类的智能感知?</t>

时间:2009-09-17 21:57:24

标签: asp.net generics

我正在为第三方javascript网格组件创建一个html.helper。我正在通过我的gridextension我的viewmodel。

在我的viewmodel类中,我的属性上有自定义属性,描述了每列的显示方式。

在我的gridextension中,我想在我的CreateSerializedRow方法中序列化我的T.类,我希望能够做类似行的事情。 &lt; - 并为我的班级获得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

}

3 个答案:

答案 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作为抽象类,并覆盖为每个数据类输出数据行的方法。

或创建一个通用接口,该接口具有Seri​​alize()方法,该方法以预期格式输出对象值的字符串。让每个模型类实现此接口,然后将GridData类约束到此接口。假设这些是ViewModel类,它应该是一个合理的设计。

答案 2 :(得分:0)

如果T总是一个已知的界面或类,你可以这样做:

public class GridData<T>
    where T:MyClass
{
 ...
}