VB.NET TO C#: Использование методов связывания данных на объекте

StackOverflow https://stackoverflow.com/questions/7806239

Вопрос

В VB.NET I создал 2 функции сокращения для привязки данных Gridviews/Roddownlists/ETC из любого данного данных (например, DataReader или Ireader или Collection и т. Д.):

Public Shared Sub BindObject(ByVal objDataSource As Object, ByVal objItem As Object)

    objItem.DataSource = objDataSource
    objItem.DataBind()
End Sub

Public Shared Sub BindObject(ByVal objDataSource As Object, ByVal objItem As Object, ByVal sTextField As String, ByVal sValueField As String)

    objItem.DataSource = objDataSource

    If sTextField <> "" Then objItem.DataTextField = sTextField
    If sValueField <> "" Then objItem.DataValueField = sValueField

    objItem.DataBind()
End Sub

Я преобразовал это в C# как таковой:

    public static void BindObject(object objDataSource, object objItem)
    {
        objItem.DataSource = objDataSource;
        objItem.DataBind();
    }

    public static void BindObject(object objDataSource, object objItem, string sTextField, string sValueField)
    {
        objItem.DataSource = objDataSource;

        if (!string.IsNullOrEmpty(sTextField))
            objItem.DataTextField = sTextField;
        if (!string.IsNullOrEmpty(sValueField))
            objItem.DataValueField = sValueField;

        objItem.DataBind();
    }

Тем не менее, это, очевидно, не работает, так как методы связывания данных недоступны для objitem, если только я не поддаю его такому типу, как «Listbox» или «Gridview» и т. Д. Аналогично я хочу сохранить гибкость, которая objdatasource может быть либо иридер, Icollection и т. Д.

Можно ли повторить подход VB.NET в C#, используя анонимные методы или что -то подобное?

Спасибо.

Это было полезно?

Решение

Вы можете использовать анонимный тип «var» или ввести оператор CASE, чтобы увидеть, какой тип ваш входящий объект.

-редактировать-

Вы правы, VAR здесь не кажется работоспособным. Попробуйте это решение вместо этого:

public void BindObject(object objDataSource, object objItem)
        {
            (objItem as BaseDataBoundControl).DataSource = objDataSource;
            (objItem as BaseDataBoundControl).DataBind();    

        }

С уважением, Пол

Другие советы

У вас есть опция строго отключена в коде VB. TSK TSK - это не лучший выбор.

Чтобы получить аналогичный эффект в C#, вы можете сделать это:

public static void BindObject(object objDataSource, dynamic objItem)
{
    objItem.DataSource = objDataSource;
    objItem.DataBind();
}

public static void BindObject(object objDataSource, dynamic objItem, string sTextField, string sValueField)
{
    objItem.DataSource = objDataSource;

    if (!string.IsNullOrEmpty(sTextField))
        objItem.DataTextField = sTextField;
    if (!string.IsNullOrEmpty(sValueField))
        objItem.DataValueField = sValueField;

    objItem.DataBind();
}

Но опять же, вы должны действительно изучить способ сделать это, который сохраняет сильную проверку типа времени компиляции.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top