CÓDIGO C# PARARA VB.NET

PITERGALDIANO 03/06/2023 17:12:20
#501474
Boa tarde, estou estando esse código, porém está em C#, ao converte-lo para VB.NET está dando um erro, mas não encontrei o motivo:

  public static SqlCommand GetInsertCommand()
{
SqlCommand _return = new SqlCommand();
_return.CommandText = "Insert Into {0} ({1}) Values ({2})";
string tabela = typeof(T).Name;
string campos = string.Empty;
string valores = string.Empty;

foreach (PropertyInfo pro in typeof(T).GetProperties().ToList().Where(p => !p.GetCustomAttribute(typeof(DataObjectFieldAttribute)) == null))
{
campos += pro.Name + ", ";
valores += "@" + pro.Name + ", ";
_return.Parameters.AddWithValue("@" + pro.Name, pro.GetValue(this));
}
campos = campos.Substring(0, campos.Length - 2);
valores = valores.Substring(0, valores.Length - 1);
_return.CommandText = string.Format(_return.CommandText, tabela, campos, valores);
return _return;
}


Convertido para VB.NET
  Public Shared Function GetInsertCommand() As SqlCommand
Dim _return As New SqlCommand
_return.CommandText = "Insert Into {0} ({1}) Values ({2})"
Dim tabela As String = GetType(T).Name
Dim campos As String = String.Empty
Dim valores As String = String.Empty

For Each pro As PropertyInfo In GetType(T).GetProperties().ToList().Where(Function(p) Not p.GetCustomAttribute(GetType(DataObjectFieldAttribute)) Is Nothing)
campos += pro.Name + ", "
valores += "@" + pro.Name + ", "
_return.Parameters.AddWithValue("@" & pro.Name, pro.GetValue(me))
Next
campos = campos.Substring(0, campos.Length - 2)
valores = valores.Substring(0, valores.Length - 1)
_return.CommandText = String.Format(_return.CommandText, tabela, campos, valores)
Return _return
End Function


O erro ocorre nessa linha:
_return.Parameters.AddWithValue("@" & pro.Name, pro.GetValue(me))

Mensagem: "ME" é valido somente em um método de instância.

em C# "this" roda certinho na mesma linha.

Onde estou me perdendo aqui?

Obrigado.
WEBMASTER 03/06/2023 18:50:56
#501475
Alterado em 03/06/2023 18:51:07 Hmmmm...
Tá estranho isso, pois me remete a uma instancia de algo e o metodo original era uma static ...
Não tem nenhum conflito "de interesses" ai não ?
Parece um estatico querendo acessar uma instancia de objeto que nao foi criado
PITERGALDIANO 03/06/2023 20:28:32
#501476
Então, como estou estudando Reflection, eu peguei esse exemplo no canal do Kerplunk no youtube.

Link: https://www.youtube.com/watch?v=fl1ChSv2yqI&list=PLxKqk8K6a4TyQZAwBJW8Ar96FcO0oWSkz

Aparentemente em C# roda certinho, mas realmente não estou conseguindo entender onde está o erro no código VB.NET

Pelo que entendi, deveria pegar o valor da propriedade do próprio objeto, no caso "pro". O nome e o tipo da propriedade estou conseguindo buscar certinho, porém travei na hora de buscar o conteúdo da propriedade.
OCELOT 05/06/2023 09:09:52
#501482
No video o método não é static, e mudando para static nem mesmo em C# vai funcionar.
DAMASCENO.CESAR 10/06/2023 21:23:35
#501503
  _return.Parameters.AddWithValue("@" & pro.Name, pro.GetValue(me)) 

Você está pegando o valor de onde?
  Dim propriedade_valor
propriedade_valor = .GetValue(OBJ, Nothing)

o objeto de onde você pega o valor deve ir no lugar de "Me"
e, depois do objeto, não esqueça da vírgula e do nothing, senão dá erro
LEONARDOVF 08/12/2023 18:24:50
#501936
Alterado em 08/12/2023 19:25:21 segue um exemplo rápido e funcional.


Imports System
Imports System.ComponentModel
Imports System.Data.SqlClient
Imports System.Linq
Imports System.Reflection
Imports ConsoleApp8_VB.Program

Module Module1

Friend Class Program

Public MustInherit Class GeraSQL(Of T As {GeraSQL(Of T), New})

Public Function GetInsertCommand() As SqlCommand
Dim _return As SqlCommand = New SqlCommand()
_return.CommandText = "Insert Into {0} ({1}) Values ({2})"
Dim tabela = GetType(T).Name
Dim campos = String.Empty
Dim valores = String.Empty

For Each pro In GetType(T).GetProperties().ToList().Where(Function(p) p.GetCustomAttribute(GetType(DataObjectFieldAttribute)) IsNot Nothing)
campos += pro.Name & ", "
valores += "@" & pro.Name & ", "
Dim x = pro.GetValue(Me)
_return.Parameters.AddWithValue("@" & pro.Name, pro.GetValue(Me))
Next
campos = campos.Substring(0, campos.Length - 2)
valores = valores.Substring(0, valores.Length - 1)
_return.CommandText = String.Format(_return.CommandText, tabela, campos, valores)
Console.WriteLine(_return.CommandText)
Console.ReadKey()
Return _return
End Function
End Class

Partial Public Class classe
Inherits GeraSQL(Of classe)
<DisplayName("MyProperty")>
<DataObjectField(False, False, True)>
Public Property MyProperty As Integer

<DisplayName("MyProperty1")>
<DataObjectField(False, False, True)>
Public Property MyProperty1 As Integer

End Class

Partial Public Class classe
Implements IDisposable
Public Sub Dispose() Implements IDisposable.Dispose
Throw New NotImplementedException()
End Sub

Public Sub insert()
Dim x = GetInsertCommand()
End Sub
End Class

End Class

Sub Main()
Try
Dim x = New classe()
x.MyProperty1 = 0
x.MyProperty = 1
x.insert()
Catch ex As Exception
Console.WriteLine(ex)
End Try
Console.ReadLine()
End Sub

End Module


LEONARDOVF 08/12/2023 19:25:51
#501937
Alterado em 08/12/2023 19:27:07 credito da conversão para plugin de conversão

https://github.com/icsharpcode/CodeConverter

https://marketplace.visualstudio.com/items?itemName=SharpDevelopTeam.CodeConverter


LEONARDOVF 08/12/2023 19:30:40
#501938
Alterado em 08/12/2023 19:31:19
Citação:

Boa tarde, estou estando esse código, porém está em C#, ao converte-lo para VB.NET está dando um erro, mas não encontrei o motivo:public static SqlCommand GetInsertCommand(){ SqlCommand _return = new SqlCommand(); _return.CommandText = "Insert Into {0} ({1}) Values ({2})"; string tabela = typeof(T).Name; string campos = string.Empty; string valores = string.Empty; foreach (PropertyInfo pro in typeof(T).GetProperties().ToList().Where(p => !p.GetCustomAttribute(typeof(DataObjectFieldAttribute)) == null)) { campos += pro.Name + ", "; valores += "@" + pro.Name + ", "; _return.Parameters.AddWithValue("@" + pro.Name, pro.GetValue(this)); } campos = campos.Substring(0, campos.Length - 2); valores = valores.Substring(0, valores.Length - 1); _return.CommandText = string.Format(_return.CommandText, tabela, campos, valores); return _return;}Convertido para VB.NETPublic Shared Function GetInsertCommand() As SqlCommand Dim _return As New SqlCommand _return.CommandText = "Insert Into {0} ({1}) Values ({2})" Dim tabela As String = GetType(T).Name Dim campos As String = String.Empty Dim valores As String = String.Empty For Each pro As PropertyInfo In GetType(T).GetProperties().ToList().Where(Function(p) Not p.GetCustomAttribute(GetType(DataObjectFieldAttribute)) Is Nothing) campos += pro.Name + ", " valores += "@" + pro.Name + ", " _return.Parameters.AddWithValue("@" & pro.Name, pro.GetValue(me)) Next campos = campos.Substring(0, campos.Length - 2) valores = valores.Substring(0, valores.Length - 1) _return.CommandText = String.Format(_return.CommandText, tabela, campos, valores) Return _return End FunctionO erro ocorre nessa linha:_return.Parameters.AddWithValue("@" & pro.Name, pro.GetValue(me))Mensagem: "ME" é valido somente em um método de instância.em C# "this" roda certinho na mesma linha.Onde estou me perdendo aqui?Obrigado.




nao nao consegui com seu codigo c#, somente com esse codigo

  
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data.SqlClient;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Security;
using System.Reflection;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
using System.Security.Policy;
using System.Text;
using System.Threading.Tasks;
using static ConsoleApp6.Program;

namespace ConsoleApp6 {
internal class Program {

public abstract class GeraSQL<T> where T : GeraSQL<T>, new() {

public SqlCommand GetInsertCommand() {
SqlCommand _return = new SqlCommand();
_return.CommandText = "Insert Into {0} ({1}) Values ({2})";
string tabela = typeof(T).Name;
string campos = string.Empty;
string valores = string.Empty;

foreach (PropertyInfo pro in typeof(T).GetProperties().ToList().Where(p => (p.GetCustomAttribute(typeof(DataObjectFieldAttribute))) != null)) {
campos += pro.Name + ", ";
valores += "@" + pro.Name + ", ";
var x = pro.GetValue(this);
_return.Parameters.AddWithValue("@" + pro.Name, pro.GetValue(this));
}
campos = campos.Substring(0, campos.Length - 2);
valores = valores.Substring(0, valores.Length - 1);
_return.CommandText = string.Format(_return.CommandText, tabela, campos, valores);
return _return;
}
}

public partial class classe : GeraSQL<classe> {
[DisplayName("MyProperty")]
[DataObjectField(false, false, true)]
public int MyProperty { get; set; }

[DisplayName("MyProperty1")]
[DataObjectField(false, false, true)]
public int MyProperty1 { get; set; }

}

public partial class classe : IDisposable {
public void Dispose() {
throw new NotImplementedException();
}

public void insert() {
var x = this.GetInsertCommand();
}
}

static void Main(string[] args) {
try {
var x = new classe();
x.MyProperty1 = 0;
x.MyProperty = 1;
x.insert();

} catch (Exception ex) {
Console.WriteLine(ex);
}
Console.ReadLine();
}
}
}
KERPLUNK 11/12/2023 10:33:40
#501943
Só torço pra que você esteja fazendo isso para aprendizado e não esteja usando isso numa aplicação que vai pra produção...

É um exemplo para demonstrar Reflection, num vídeo que fiz faz uns 7 anos atrás. Ou seja, extremamente defasado.
KERPLUNK 11/12/2023 11:14:51
#501944
Explicando:
No vídeo(na série toda de vídeos), eu explico o uso de reflection, que é baseado em herança. O objetivo é ensinar a usar a combinação de todo o conteúdo anterior(OOP, herança e incluindo reflection) e não fornecer código fonte para simplesmente baixar e sair mexendo. Se acompanhar os vídeos todos, com certeza vai entender.

Usar isso num cenário real, é uma bobagem, vai com certeza ser mais lento, muito mais propenso à erros e mais difícil de manter. Existem dezenas de ORM's que deveriam ser a primeira opção, como o Entity Framework, Dapper ou NHibernate.
DAMASCENO.CESAR 12/12/2023 17:17:56
#501958
  campos = campos.Substring(0, campos.Length - 2)
valores = valores.Substring(0, valores.Length - 1)


Se nas duas variáveis você coloca ", " (vírgula e espaço) porque em CAMPOS você elimina os 2últimos caracteres (vírgula e espaço) e em VALORES você elimina apenas o último caracter??
Faça seu login para responder