Esta é realmente uma resposta inútil, não merece votos positivos. A reflexão de um objeto do tipo objeto não produzirá o "tipo real" do objeto, conforme solicitado pelo OP. Além disso, sua lógica MyMethod é falha porque obj pode ser do tipo A e também pode ser do tipo B. Sua lógica não fornece o "tipo real" (conforme solicitado pelo OP) - fornece um tipo compatível, e não necessariamente o tipo desejado nisso.
Jazimov
use obj.GetType (). Isso definitivamente retornará seu tipo real.
JSON
3
Que tal JsonConvert.DeserializeObject (object.ToString ());
Esta não é uma resposta satisfatória. A pergunta de OP não tem nada a ver com Json ou serialização.
@ user12637955 esta é na verdade uma resposta funcional, mas tem maior complexidade, devido ao boxing e unboxing, ou seja, objeto -> ToString () -> ao tipo concreto. Para ser mais preciso, deve ser assim:var myType = JsonConvert.DeserializeObject<MyType>(object.ToString());
Coca
1
No meu caso, o AutoMapper funciona bem.
O AutoMapper pode mapear de / para objetos dinâmicos sem qualquer configuração explícita:
Este método pode não ser o mais eficiente, mas é simples e faz o trabalho.
Ele executa duas operações: primeiro chama .ToString (), que é basicamente uma serialização, e depois a desserialização usando o nuget Newtonsoft (que você deve instalar).
public T Format<T>(Object obj)=>JsonConvert.DeserializeObject<T>(obj.ToString());
Você deve descrever sua resposta brevemente para os futuros leitores.
Suraj Kumar
0
Se o seu MyFunction()método é definido apenas em uma classe (e seus descendentes), tente
voidMyMethod(Object obj){var o = obj asMyClass;if(o !=null)
o.MyFunction();}
Se você tem um grande número de classes não relacionadas definindo a função que deseja chamar, você deve definir uma interface e fazer suas classes definirem essa interface:
interfaceIMyInterface{voidMyFunction();}voidMyMethod(Object obj){var o = obj asIMyInterface;if(o !=null)
o.MyFunction();}
Converta-o em seu tipo real se você agora o tipo, por exemplo, é orientado a partir de uma classe chamada abc. Você pode chamar sua função desta forma:
(abc)(obj)).MyFunction();
se você não conhece a função, pode ser feito de uma maneira diferente. Nem sempre é fácil. Mas você pode encontrá-lo de alguma forma por sua assinatura. Se este for o seu caso, informe-nos.
Isso é ilógico. Na verdade, você não conhece o tipo real. Como você deve fazer isso?
Allen Linatoc
-2
Implement an interface to call your function in your method
interfaceIMyInterface{voidMyinterfaceMethod();}IMyInterfaceMyObj= obj asIMyInterface;if(MyObj!=null){MyMethod(IMyInterfaceMyObj);}
obj.MyFunction();
não compila, embora eu saiba que o objeto real tem essa função.MyFunction
método?Respostas:
Se você souber o tipo real, basta:
Se você não conhece o tipo real, então: não realmente, não. Você teria que usar um dos seguintes:
Por exemplo:
fonte
as
para typecasting etype(of: ClassName)
função para verificar o tipo de instância.Eu não acho que você pode (não sem reflexão), você deve fornecer um tipo para sua função também:
UPD :
Isso pode funcionar para você:
fonte
Que tal JsonConvert.DeserializeObject (object.ToString ());
fonte
var myType = JsonConvert.DeserializeObject<MyType>(object.ToString());
No meu caso, o AutoMapper funciona bem.
O AutoMapper pode mapear de / para objetos dinâmicos sem qualquer configuração explícita:
Da mesma forma, você pode mapear diretamente dos dicionários para os objetos, o AutoMapper alinhará as chaves com os nomes das propriedades.
mais informações https://github.com/AutoMapper/AutoMapper/wiki/Dynamic-and-ExpandoObject-Mapping
fonte
Este método pode não ser o mais eficiente, mas é simples e faz o trabalho.
Ele executa duas operações: primeiro chama .ToString (), que é basicamente uma serialização, e depois a desserialização usando o nuget Newtonsoft (que você deve instalar).
fonte
Se o seu
MyFunction()
método é definido apenas em uma classe (e seus descendentes), tenteSe você tem um grande número de classes não relacionadas definindo a função que deseja chamar, você deve definir uma interface e fazer suas classes definirem essa interface:
fonte
Converta-o em seu tipo real se você agora o tipo, por exemplo, é orientado a partir de uma classe chamada abc. Você pode chamar sua função desta forma:
se você não conhece a função, pode ser feito de uma maneira diferente. Nem sempre é fácil. Mas você pode encontrá-lo de alguma forma por sua assinatura. Se este for o seu caso, informe-nos.
fonte
Transmitir para o tipo real é fácil:
fonte
fonte