Pregunta

En VB.NET, creé 2 funciones de abreviatura para la parrilla de enlace de datos/vistas de desplazamiento/etc. a partir de cualquier fuente de datos (como un DataArader o Ireader o Collection, 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

Convertí esto a C# como tal:

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

Sin embargo, esto obviamente no funciona ya que los métodos de unión de datos no son accesibles para objitem, a menos que explique que lo arroje a un tipo como "ListBox" o "GridView", etc. De manera similar, quiero conservar la flexibilidad de que objdataSource puede ser un IRADER, ICOLCHECTION, etc.

¿Es posible replicar el enfoque VB.NET en C# usando métodos anónimos o algo similar?

Gracias.

¿Fue útil?

Solución

Puede usar el tipo anónimo "var" o ingresar una instrucción de caso para ver qué tipo es su objeto entrante.

-editar-

Tienes razón, el VAR no parece viable aquí. Pruebe esta solución en su lugar:

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

        }

Saludos, Paul

Otros consejos

Tienes opción estricta desactivada en tu código VB. TSK TSK: esa no es realmente la mejor opción.

Para obtener un efecto similar en C#, puede hacer esto:

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

Pero de nuevo, realmente debería buscar una forma de hacer esto que preserva una fuerte verificación de tipo de compilación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top