Если у меня есть:
void MyMethod(Object obj) { ... }
Как я могу использовать obj
для своего фактического типа?
Если у меня есть:
void MyMethod(Object obj) { ... }
Как я могу использовать obj
для своего фактического типа?
Если вы знаете фактический тип, просто:
SomeType typed = (SomeType)obj;
typed.MyFunction();
Если вы не знаете фактического типа, то: не совсем, нет. Вам нужно будет использовать один из следующих вариантов:
Например:
// 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();
Я не думаю, что вы можете (не без размышлений), вы должны указать тип своей функции:
void MyMethod(Object obj, Type t)
{
var convertedObject = Convert.ChangeType(obj, t);
...
}
UPD
Это может сработать для вас:
void MyMethod(Object obj)
{
if (obj is A)
{
A a = obj as A;
...
}
else if (obj is B)
{
B b = obj as B;
...
}
}
Отливка от фактического типа проста:
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 );
}
Если ваш метод MyFunction()
определен только в одном классе (и его потомках), попробуйте
void MyMethod(Object obj)
{
var o = obj as MyClass;
if (o != null)
o.MyFunction();
}
Если у вас есть большое число в несвязанных классах, определяющих функцию, которую вы хотите вызвать, вы должны определить интерфейс и сделать ваши классы определяющими этот интерфейс:
interface IMyInterface
{
void MyFunction();
}
void MyMethod(Object obj)
{
var o = obj as IMyInterface;
if (o != null)
o.MyFunction();
}
Передайте его реальному типу, если теперь вы тип, например, ориентирован от класса с именем abc. Вы можете вызвать свою функцию следующим образом:
(abc)(obj)).MyFunction();
если вы не знаете функцию, это может быть сделано по-другому. Нелегко всегда. Но вы можете найти его каким-то образом подписи. Если это ваш случай, вы должны сообщить нам.
В моем случае AutoMapper работает хорошо.
AutoMapper может отображаться в/из динамических объектов без какой-либо явной конфигурации:
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);
Аналогично, вы можете напрямую сопоставлять словари с объектами, AutoMapper будет выстраивать ключи с именами свойств.
подробнее https://github.com/AutoMapper/AutoMapper/wiki/Dynamic-and-ExpandoObject-Mapping