ошибка в InvokeMember SetProperty с приведением - PullRequest
0 голосов
/ 15 января 2012

Я хочу установить свойство с помощью .InvokeMember, но не могу этого сделать, когда требуется приведение,

public Class A{
  private B? _bb;
  public B? Bb{
    get{return _bb;}
    set {_bb=value;}
  }
}


public struct B {
  public B(int i){}
  public static implicit operator B(int p)
        {   B q = new B(p);
            return q;
        }
}

, когда я устанавливаю его с помощью простого кода, оно работает.

A myA=new A();
myA.Bb=12;

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

этот код работает

A myA=new A();
myA.GetType().InvokeMember("Bb", 
   BindingFlags.SetProperty, null,myA, new object[] { new B(12) });

, но следующая строка дает ошибкуи говорит, что не может найти свойство "Bb"

A myA=new A();
myA.GetType().InvokeMember("Bb", 
   BindingFlags.SetProperty, null,myA, new object[] { 12});

Я должен использовать его последним способом, как я должен это сделать?

1 Ответ

2 голосов
/ 15 января 2012

Это даже не скомпилируется. B является ссылочным типом, поэтому вы не можете использовать его как универсальный аргумент для класса Nullable<T>:

// Impossible
private B? _bb;

При этом, если вы исправите свой код и объявите B как тип значения (например, с использованием struct), проблема в том, что в Reflection не используются операторы неявного преобразования.

Вы можете взглянуть на следующую ветку для одного возможного решения.

Другая возможность - вызвать статический метод op_Implicit, испускаемый компилятором, для преобразования целого числа в экземпляр B:

A myA = new A();
var op_Implicit = typeof(B).GetMethod("op_Implicit");
B myB = (B)op_Implicit.Invoke(null, new object[] { 12 });
myA.GetType().InvokeMember("Bb", BindingFlags.SetProperty, null, myA, new object[] { myB });
...