Se eu tiver:
void MyMethod(Object obj) { ... }
Como posso converter o obj
que é seu tipo real?
obj.MyFunction();
não compila, embora eu saiba que o objeto real tem essa função.
MyFunction
método?
Se eu tiver:
void MyMethod(Object obj) { ... }
Como posso converter o obj
que é seu tipo real?
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:
SomeType typed = (SomeType)obj;
typed.MyFunction();
Se você não conhece o tipo real, então: não realmente, não. Você teria que usar um dos seguintes:
Por exemplo:
// reflection
obj.GetType().GetMethod("MyFunction").Invoke(obj, null);
// interface
IFoo foo = (IFoo)obj; // where SomeType : IFoo and IFoo declares MyFunction
foo.MyFunction();
// dynamic
dynamic d = obj;
d.MyFunction();
as
para typecasting e type(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:
void MyMethod(Object obj, Type t)
{
var convertedObject = Convert.ChangeType(obj, t);
...
}
UPD :
Isso pode funcionar para você:
void MyMethod(Object obj)
{
if (obj is A)
{
A a = obj as A;
...
}
else if (obj is B)
{
B b = obj as B;
...
}
}
Que tal JsonConvert.DeserializeObject (object.ToString ());
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:
public class Foo {
public int Bar { get; set; }
public int Baz { get; set; }
}
dynamic foo = new MyDynamicObject();
foo.Bar = 5;
foo.Baz = 6;
Mapper.Initialize(cfg => {});
var result = Mapper.Map<Foo>(foo);
result.Bar.ShouldEqual(5);
result.Baz.ShouldEqual(6);
dynamic foo2 = Mapper.Map<MyDynamicObject>(result);
foo2.Bar.ShouldEqual(5);
foo2.Baz.ShouldEqual(6);
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
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());
Se o seu MyFunction()
método é definido apenas em uma classe (e seus descendentes), tente
void MyMethod(Object obj)
{
var o = obj as MyClass;
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:
interface IMyInterface
{
void MyFunction();
}
void MyMethod(Object obj)
{
var o = obj as IMyInterface;
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.
Transmitir para o tipo real é fácil:
void MyMethod(Object obj) {
ActualType actualyType = (ActualType)obj;
}
Implement an interface to call your function in your method
interface IMyInterface
{
void MyinterfaceMethod();
}
IMyInterface MyObj = obj as IMyInterface;
if ( MyObj != null)
{
MyMethod(IMyInterface MyObj );
}