Jeżeli mam:
void MyMethod(Object obj) { ... }
Jak mogę rzutować obj
na jaki jest jego rzeczywisty typ?
obj.MyFunction();
nie kompiluje się, chociaż wiem, że rzeczywisty obiekt ma taką funkcję.
MyFunction
metodę?
Jeżeli mam:
void MyMethod(Object obj) { ... }
Jak mogę rzutować obj
na jaki jest jego rzeczywisty typ?
obj.MyFunction();
nie kompiluje się, chociaż wiem, że rzeczywisty obiekt ma taką funkcję.
MyFunction
metodę?
Odpowiedzi:
Jeśli znasz rzeczywisty typ, po prostu:
SomeType typed = (SomeType)obj;
typed.MyFunction();
Jeśli nie znasz konkretnego typu, to: nie do końca, nie. Zamiast tego musiałbyś użyć jednego z:
Na przykład:
// 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
do rzutowania type(of: ClassName)
typów i funkcji sprawdzającej typ instancji.
Myślę, że nie możesz (nie bez refleksji), powinieneś także podać typ swojej funkcji:
void MyMethod(Object obj, Type t)
{
var convertedObject = Convert.ChangeType(obj, t);
...
}
UPD :
To może Ci pomóc:
void MyMethod(Object obj)
{
if (obj is A)
{
A a = obj as A;
...
}
else if (obj is B)
{
B b = obj as B;
...
}
}
A co z JsonConvert.DeserializeObject (object.ToString ());
var myType = JsonConvert.DeserializeObject<MyType>(object.ToString());
W moim przypadku AutoMapper działa dobrze.
AutoMapper może mapować do / z obiektów dynamicznych bez żadnej jawnej konfiguracji:
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);
Podobnie możesz mapować bezpośrednio ze słowników do obiektów, AutoMapper ustawi klucze w linii z nazwami właściwości.
więcej informacji https://github.com/AutoMapper/AutoMapper/wiki/Dynamic-and-ExpandoObject-Mapping
Ta metoda może nie być najbardziej wydajna, ale jest prosta i spełnia swoje zadanie.
Wykonuje dwie operacje: najpierw wywołuje .ToString (), który jest zasadniczo serializacją, a następnie deserializację przy użyciu nuget Newtonsoft (który należy zainstalować).
public T Format<T>(Object obj) =>
JsonConvert.DeserializeObject<T>(obj.ToString());
Jeśli twoja MyFunction()
metoda jest zdefiniowana tylko w jednej klasie (i jej potomkach), spróbuj
void MyMethod(Object obj)
{
var o = obj as MyClass;
if (o != null)
o.MyFunction();
}
Jeśli masz dużą liczbę w niepowiązanych klasach definiujących funkcję, którą chcesz wywołać, powinieneś zdefiniować interfejs i sprawić, by klasy definiowały ten interfejs:
interface IMyInterface
{
void MyFunction();
}
void MyMethod(Object obj)
{
var o = obj as IMyInterface;
if (o != null)
o.MyFunction();
}
Przerzuć go na jego rzeczywisty typ, jeśli teraz typ, na przykład jest zorientowany z klasy o nazwie abc. Możesz wywołać swoją funkcję w ten sposób:
(abc)(obj)).MyFunction();
jeśli nie znasz funkcji, możesz to zrobić w inny sposób. Nie zawsze łatwo. Ale możesz to znaleźć w jakiś sposób po jego sygnaturze. Jeśli tak jest w Twoim przypadku, daj nam znać.
Rzutowanie na rzeczywisty typ jest łatwe:
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 );
}