Vb.net a C#: utilizando métodos de unión de datos en el objeto
-
25-10-2019 - |
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.
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.