CÓDIGO C# PARARA VB.NET
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.
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
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.
_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
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
https://github.com/icsharpcode/CodeConverter
https://marketplace.visualstudio.com/items?itemName=SharpDevelopTeam.CodeConverter
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();
}
}
}
É um exemplo para demonstrar Reflection, num vídeo que fiz faz uns 7 anos atrás. Ou seja, extremamente defasado.
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.
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??