Frage

In VB.NET erstellt habe ich 2 Kurzform Funktionen zur Daten-Bindung gridviews/dropdownlists/etc aus einer beliebigen Datenquelle (wie ein DataReader oder IReader oder Sammlung, etc):

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

Ich wandelte diese in C# wie folgt:

    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();
    }

Doch ist dies natürlich nicht funktionieren, da der Daten-Bindung Methoden nicht zugänglich objItem,, wenn ich ausdrücklich werfe es in einen Typ wie "ListBox" oder "Gridview", etc.Ebenso möchte ich behalten die Flexibilität, die objDataSource kann entweder ein IReader, iCollection, etc.

Ist es möglich zu replizieren, die VB.NET Ansatz in C# anonyme Methoden oder etwas ähnliches?

Vielen Dank.

War es hilfreich?

Lösung

Sie könnte verwenden die "var" anonymen Typ oder geben Sie eine case-Anweisung, um zu sehen, was geben Sie Ihre eingehende Objekt.

-Bearbeiten-

Sie sind richtig, der var scheint nicht praktikabel, hier.Bitte versuchen Sie diese Lösung statt:

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

        }

Grüße, Paul

Andere Tipps

Du hast die Option Strict ausgeschaltet in Ihrem VB-code.Tsk-tsk — das ist nicht wirklich die beste Wahl.

Um einen ähnlichen Effekt in C# können Sie dies tun:

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();
}

Aber wieder, sollten Sie wirklich einen Blick in einen Weg, das zu tun, bewahrt strong compile-time type checking.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top