una quitar que programacion primeros los longitud invertida funciones extraer ejemplos comparar caracteres cadenas cadena .net vb.net method-call

.net - que - quitar los primeros 3 caracteres de una cadena c#



Crear una llamada a método en.NET basada en un valor de cadena (11)

La solución "Más cercana a tu pregunta".

Puede hacer delegados de esos informes y llamarlos buscando la Cadena correspondiente en una tabla Hash:

Public Sub New() ''... ReportTable.Add("Security", New ReportDelegate(AddressOf ShowSecurityReport)) ReportTable.Add("Config", New ReportDelegate(AddressOf ShowConfigReport)) ReportTable.Add("RoleUsers", New ReportDelegate(AddressOf ShowRoleUsersReport)) ''... End Sub Private Sub ShowSecurityReport() ''... End Sub Private Sub ShowConfigReport() ''... End Sub Private Sub ShowRoleUsersReport() ''... End Sub Private Delegate Sub ReportDelegate() Private ReportTable As New Dictionary(Of String, ReportDelegate) Private Sub ShowReport(ByVal reportName As String) Dim ReportToRun As ReportDelegate If ReportTable.TryGetValue(reportName, ReportToRun) Then ReportToRun() Else pnlMessage.Visible = True litMessage.Text = "The report name """ + reportName + """ is invalid." End If End Sub

De esta forma, puede agregar tantos informes como desee, y su capacidad para reflejarlos, y el impacto de la reflexión, no son un problema.

En este momento, tengo un código que se ve así:

Private Sub ShowReport(ByVal reportName As String) Select Case reportName Case "Security" Me.ShowSecurityReport() Case "Configuration" Me.ShowConfigurationReport() Case "RoleUsers" Me.ShowRoleUsersReport() Case Else pnlMessage.Visible = True litMessage.Text = "The report name """ + reportName + """ is invalid." End Select End Sub

¿Hay alguna forma de crear código que use las convenciones de nombres de mi método para simplificar las cosas? Aquí hay un pseudocódigo que describe lo que estoy buscando:

Private Sub ShowReport(ByVal reportName As String) Try Call("Show" + reportName + "Report") Catch ex As Exception ''method not found End Try End Sub


Podría usar el reflejo para hacer esto, pero para ser honesto, creo que es algo complicado para su escenario particular, es decir, el código y el interruptor () en la misma clase.

Ahora, si ha diseñado la aplicación para tener cada tipo de informe en su propio ensamblaje (como una arquitectura de complementos / complementos) o en un único ensamblaje externo, puede cargar los ensamblados de informes en un dominio de aplicación y luego usa la reflexión para hacer esto.


Puede usar System.Reflection . Vea este artículo de proyecto de código para más información.

string ModuleName = "TestAssembly.dll"; string TypeName = "TestClass"; string MethodName = "TestMethod"; Assembly myAssembly = Assembly.LoadFrom(ModuleName); BindingFlags flags = (BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly); Module [] myModules = myAssembly.GetModules(); foreach (Module Mo in myModules) { if (Mo.Name == ModuleName) { Type[] myTypes = Mo.GetTypes(); foreach (Type Ty in myTypes) { if (Ty.Name == TypeName) { MethodInfo[] myMethodInfo = Ty.GetMethods(flags); foreach(MethodInfo Mi in myMethodInfo) { if (Mi.Name == MethodName) { Object obj = Activator.CreateInstance(Ty); Object response = Mi.Invoke(obj, null); } } } } } }


Puedes usar la reflexión Aunque personalmente, creo que deberías seguir con la declaración de cambio.

private void ShowReport(string methodName) { Type type = this.GetType(); MethodInfo method = type.GetMethod("Show"+methodName+"Report", BindingFlags.Public) method.Invoke(this, null); }

Lo siento, estoy haciendo C #. Simplemente tradúzcalo a VB.NET.


Python (e IronPython) pueden hacer esto con mucha facilidad. Sin embargo, con .Net, necesitas usar la reflexión.

En C #: http://www.dotnetspider.com/resources/4634-Invoke-me-ods-dynamically-using-reflection.aspx

Mi puerto rápido para VB.Net:

Private Sub InvokeMethod(instance as object, methodName as string ) ''Getting the method information using the method info class Dim mi as MethodInfo = instance.GetType().GetMethod(methodName) ''invoing the method ''null- no parameter for the function [or] we can pass the array of parameters mi.Invoke(instance, Nothing) End Sub


Reflection API le permite obtener un MethodInfo partir de un método, y luego invocar Invoke dinámicamente en él. Pero es excesivo en tu caso.

Debería considerar tener un diccionario de delegados indexado por cadenas.


Si entiendo la pregunta correctamente, tendrá que usar Reflection para encontrar el método "show" + reportName y luego invocarlo indirectamente:

Ejemplo a medio cocer:

Case "financial" : { Assembly asm = Assembly.GetExecutingAssembly (); MethodInfo mi = asm.GetType ("thisClassType").GetMethod ("showFinancialReport"); if (mi != null) mi.Invoke (null, new object[] {}); }

Inserte su propia lógica allí para inventar el nombre del método para llamar.

Consulte la documentación de MSDN de MethodInfo y Assembly para obtener más información.


Tienes un problema más profundo. Tus cadenas son muy importantes. ¿Quién te está pasando cadenas? puedes hacer que ellos no hagan eso?

Sigue con la declaración del interruptor, ya que desacopla tu implementación interna (nombres de métodos) desde tu vista externa.

Supongamos que localizas esto en alemán. ¿Cambiarás el nombre de todos esos métodos?


Usa la reflexión En el System.Reflection nombres System.Reflection necesita obtener un objeto MethodInfo para el método que desee, utilizando GetMethod("methodName") en el tipo que contiene el método.

Una vez que tenga el objeto MethodInfo , puede llamar a .Invoke() con la instancia del objeto y cualquier parámetro.

Por ejemplo:

System.Reflection.MethodInfo method = this.GetType().GetMethod("foo"); method.Invoke(this, null);


Usando la reflexión:

Type t = this.GetType(); try { MethodInfo mi = t.GetMethod(methodName, ...); if (mi != null) { mi.Invoke(this, parameters); } }

Pero estoy de acuerdo con hace tiempo, mejor no cambies tu código original ;-)


Type type = GetType(); MethodInfo method = type.GetMethod("Show"+reportName+"Report"); if (method != null) { method.Invoke(this, null); }

Esto es C #, debería ser lo suficientemente fácil como para convertirlo en VB. Si necesita pasar un parámetro al método, se pueden agregar en el segundo argumento a Invocar.