VB.NET в C #: использование методов привязки данных к объекту - PullRequest
1 голос
/ 18 октября 2011

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

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 может быть либо IReader, iCollection и т. д.

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

Спасибо.

Ответы [ 2 ]

1 голос
/ 18 октября 2011

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

-edit-

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

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

        }

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

0 голосов
/ 18 октября 2011

В вашем коде VB отключен Option Strict.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();
}

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

...