Как неявно привести к отраженному вызову метода

У меня есть классThing который неявно кастуется изstring, Когда я вызываю метод сThing параметр непосредственно приведен изstring вThing сделано правильно.

Однако, если я использую отражение для вызова того же метода, он выдает исключение

System.ArgumentException : Object of type 'System.String' cannot be 
converted to type 'Things.Program+Thing'.

Может быть, для этого есть веская причина, но я не могу в этом разобраться. У кого-нибудь есть идея, как заставить это работать, используя отражение?

namespace Things
{
    class Program
    {
        public class Thing
        {
            public string Some;

            public static implicit operator Thing(string s)
            {
                return new Thing {Some = s};
            }
        }

        public void showThing(Thing t)
        {
            Console.WriteLine("Some = " + t.Some);
        }

        public void Main()
        {
            showThing("foo");
            MethodInfo showThingReflected = GetType().GetMethod("showThing");
            showThingReflected.Invoke(this, new dynamic[] {"foo"});
        }
    }
}

Мета:Please, no discussions why implicit casting or reflection is bad.

 Ani18 июл. 2012 г., 17:08
Если вы действительно хотите это сделать, вы можете создать дерево выражений, которое делает то, что вам нужно, а затем скомпилировать его в метод и выполнить его. Если вы чувствуете, что это работает для вас, я могу добавить это в качестве ответа.
 Saeed Amiri18 июл. 2012 г., 16:58
Неявное приведение невозможно с помощью отражения, но вы можете использоватьTypeConvertor.
 James Barrass18 июл. 2012 г., 16:54
аналогичный вопросhere
 Dio F18 июл. 2012 г., 17:16
@ChrisSinclair: На самом деле я использую стороннее приложение, которое выполняет рефлексию. Но я думаю, что могу как-то обернуть это.
 Chris Sinclair18 июл. 2012 г., 16:48
Вдобавок ко всему, я бы поставил на это, потому что (я думаю, и исправьте меня, если я ошибаюсь), что неявное приведение является сахаром синтаксиса для компилятора. То, что фактические вызовы метода приведения связаны во время компиляции. РЕДАКТИРОВАТЬ: Вам нужно иметь какой-то общий способ вызова неявного преобразователя для любого преобразования объекта? Или это особый случай, когда вы захотите нацелить отдельный статический метод или какой-либо другой вызов отражения на заранее определенный метод или, возможно, на специализированный конструктор?

Ответы на вопрос(3)

Решение Вопроса
 Dio F18 июл. 2012 г., 18:09
Спасибо. Это работает для меня.

чтобы понять, что компилятор создает специальный статический метод, называемыйop_Implicit для вашего оператора неявного преобразования.

object arg = "foo";

// Program.showThing(Thing t)
var showThingReflected = GetType().GetMethod("showThing");

// typeof(Thing)
var paramType = showThingReflected.GetParameters()
                                  .Single()
                                  .ParameterType; 

// Thing.implicit operator Thing(string s)
var converter = paramType.GetMethod("op_Implicit", new[] { arg.GetType() });

if (converter != null)
    arg = converter.Invoke(null, new[] { arg }); // Converter exists: arg = (Thing)"foo";

// showThing(arg)
showThingReflected.Invoke(this, new[] { arg });
 20 сент. 2016 г., 08:00
вот еще один аналогичный ответ:stackoverflow.com/a/32025393/2230844
 20 сент. 2016 г., 07:55
блестящий !!!!!!!!!!!!!

массива, то есть

showThingReflected.Invoke(this, new Thing[] {"foo"});

но это своего рода "обман". В общем, вы не можете ожидатьInvoke рассмотреть ваш пользовательскийimplicit operator, Это преобразование должно быть выведено во время компиляции.

Ваш ответ на вопрос