И чего вы ожидаете от этого? Пожалуйста, расскажите нам, чего вы пытаетесь достичь, а не как вы рассчитываете достичь этого.
Джон Скит,
@JonSkeet: я хочу иметь возможность вызывать функцию из объекта. В настоящее время obj.MyFunction();не компилируется, хотя я знаю, что у реального объекта есть эта функция.
Пол Ласситер
@ psubsee2003: нет, это не так, потому что это ссылка на объект, передаваемая через взаимодействие.
Пол Ласситер
3
@PaulLassiter: Если вы не знаете тип, что объявляет MyFunctionметод?
Это действительно бесполезный ответ, не заслуживающий голосов "за". Отражение объекта типа object не даст «фактического типа» объекта, как того требует OP. Кроме того, ваша логика MyMethod ошибочна, потому что obj может иметь тип A, а также может иметь тип B. Ваша логика не предоставляет «фактический тип» (как запрошено OP) - она предоставляет совместимый тип, и не обязательно желаемый тип при этом.
Jazimov 03
используйте obj.GetType (). Это обязательно вернет его фактический тип.
JSON
3
Как насчет JsonConvert.DeserializeObject (object.ToString ());
Это неудовлетворительный ответ. Вопрос OP не имеет ничего общего с Json или сериализацией.
@ user12637955 на самом деле это рабочий ответ, но он имеет большую сложность из-за упаковки и распаковки, то есть объект -> ToString () -> конкретный тип. Если быть более точным, это должно выглядеть так:var myType = JsonConvert.DeserializeObject<MyType>(object.ToString());
Coke
1
В моем случае AutoMapper работает хорошо.
AutoMapper может отображать / из динамических объектов без какой-либо явной конфигурации:
Этот метод может быть не самым эффективным, но он прост и выполняет свою работу.
Он выполняет две операции: сначала он вызывает .ToString (), который в основном представляет собой сериализацию, а затем десериализацию с использованием Newtonsoft nuget (который вы должны установить).
public T Format<T>(Object obj)=>JsonConvert.DeserializeObject<T>(obj.ToString());
Если ваш MyFunction()метод определен только в одном классе (и его потомках), попробуйте
voidMyMethod(Object obj){var o = obj asMyClass;if(o !=null)
o.MyFunction();}
Если у вас есть большое количество несвязанных классов, определяющих функцию, которую вы хотите вызвать, вы должны определить интерфейс и сделать так, чтобы ваши классы определяли этот интерфейс:
interfaceIMyInterface{voidMyFunction();}voidMyMethod(Object obj){var o = obj asIMyInterface;if(o !=null)
o.MyFunction();}
Приведите его к его реальному типу, если вы теперь используете тип, например, он ориентирован из класса с именем abc. Вы можете вызвать свою функцию таким образом:
(abc)(obj)).MyFunction();
если вы не знаете функцию, это можно сделать по-другому. Не всегда просто. Но каким-то образом его можно найти по подписи. Если это ваш случай, сообщите нам об этом.
Это нелогично. На самом деле вы не знаете, какой именно тип. Как ты должен это сделать?
Аллен Линаток,
-2
Implement an interface to call your function in your method
interfaceIMyInterface{voidMyinterfaceMethod();}IMyInterfaceMyObj= obj asIMyInterface;if(MyObj!=null){MyMethod(IMyInterfaceMyObj);}
obj.MyFunction();
не компилируется, хотя я знаю, что у реального объекта есть эта функция.MyFunction
метод?Ответы:
Если вы знаете фактический тип, просто:
Если вы не знаете фактический тип, тогда: не совсем, нет. Вместо этого вам придется использовать одно из:
Например:
источник
as
для приведения типов иtype(of: ClassName)
функция для проверки типа экземпляра.Я не думаю, что вы можете (не без размышлений), вы также должны указать тип своей функции:
UPD :
Это может сработать для вас:
источник
Как насчет JsonConvert.DeserializeObject (object.ToString ());
источник
var myType = JsonConvert.DeserializeObject<MyType>(object.ToString());
В моем случае AutoMapper работает хорошо.
AutoMapper может отображать / из динамических объектов без какой-либо явной конфигурации:
Точно так же вы можете отображать объекты прямо из словарей, AutoMapper сопоставит ключи с именами свойств.
подробнее https://github.com/AutoMapper/AutoMapper/wiki/Dynamic-and-ExpandoObject-Mapping
источник
Этот метод может быть не самым эффективным, но он прост и выполняет свою работу.
Он выполняет две операции: сначала он вызывает .ToString (), который в основном представляет собой сериализацию, а затем десериализацию с использованием Newtonsoft nuget (который вы должны установить).
источник
Если ваш
MyFunction()
метод определен только в одном классе (и его потомках), попробуйтеЕсли у вас есть большое количество несвязанных классов, определяющих функцию, которую вы хотите вызвать, вы должны определить интерфейс и сделать так, чтобы ваши классы определяли этот интерфейс:
источник
Приведите его к его реальному типу, если вы теперь используете тип, например, он ориентирован из класса с именем abc. Вы можете вызвать свою функцию таким образом:
если вы не знаете функцию, это можно сделать по-другому. Не всегда просто. Но каким-то образом его можно найти по подписи. Если это ваш случай, сообщите нам об этом.
источник
Приведение к фактическому типу очень просто:
источник
источник