将值设置为Object而不知道类型

时间:2012-05-10 23:47:27

标签: c# reflection .net-4.0

通常,如果对象是类实例,我会使用反射为其成员设置值。请考虑以下事项:

class Foo
{
  public Control _tCtrl { get; set; }
  public Object _tObj { get; set; }

  public void Set()
  {
    // How do I give tObj the converted value of _tCtrl.ToString() ?

    // var val = Convert.ChangeType( _tCtrl.ToString(), tObj.GetType() );
    // _tObj.SetValue( val );
  }
}

调用它就像:

Class Bar
{
  public Int32 _i { get; set; }
}


Bar bar = new Bar();   
Foo foo = new Foo();

foo._tCtrl = new TextBox() { Text = "100" };
foo._tObj = bar._i;    
foo.Set();

或者:

Foo foo = new Foo();
Int32 i;

foo._tCtrl = new TextBox() { Text = "100" };
foo._tObj = i;

foo.Set();    

任何东西都可以传递给Set()。假设我可以从String转换为tObj.GetType()的任何类型。

2 个答案:

答案 0 :(得分:1)

我认为这归结为将字符串转换为任何其他类型。那有问题。如何将字符串转换为FormList<>Random?它需要您为.NET Framework中的每种类型(或者可能是Universe中的每个现有类型)编写转换器。

你不应该试图这样做。我不知道你想要达到的目标,但几乎肯定有更好的方法。

答案 1 :(得分:0)

无法允许这种语法,但您可以执行以下操作:

foo.Set(bar, "_i");

Set使用以下内容:

type.GetProperty(propertyName, Type.EmptyTypes).SetValue(tObj, value, Type.EmptyTypes);

propertyNametObjvalue在其他位置定义的位置。