使用反射从字段中获取属性

yes*_*man 1 c#

我有这些课程:

public class Foo
{
    public Bar bar;
}

public class Bar
{
    public List<int> Something { get; set; }
    public string Else { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我有很多类似的课程Foo。它们都只包含一个字段。Bar在我的例子中,这个字段每次都是不同类型的对象,它不必是 type Bar。无论它是什么对象(Bar或其他),该字段将始终是一个具有两个属性的对象,SomethingElse

我的挑战:给定任何类似于 Foo 的对象(具有一个包含两个属性的 Field),获取这两个属性的值。鉴于这种方法:

public void DoStuff(object myObject)
{
    var asdf = myObject.GetType().GetFields().First();
}
Run Code Online (Sandbox Code Playgroud)

我可以获得 Bar 的 FieldInfo。我正在寻找的是值SomethingElse。这些属性的名称永远不会改变。无论字段的类型是什么,它总会有两个命名的属性,Something并且Else它们的类型相同。

遗憾的是,我的问题涉及自动生成的代码,并且没有我可以轻松使用的共享接口或基本类型。

Tho*_*kow 5

使用此代码,您可以检索和属性的PropertyInfos :SomethingElse

Foo myObject = new Foo { bar = new Bar() };

// the FieldInfo for Foo.bar
var barField = myObject.GetType().GetFields().First();

// the Bar instance, i.e. myObject.bar
var barValue = barField.GetValue(myObject);

var somethingProperty = barField.FieldType.GetProperty("Something", BindingFlags.Instance | BindingFlags.Public);
var elseProperty = barField.FieldType.GetProperty("Else", BindingFlags.Instance | BindingFlags.Public);
Run Code Online (Sandbox Code Playgroud)

作为PsiHamster指出的,然后你可以使用GetValueSetValue检索和设置的值somethingPropertyelseProperty这样的:

// get the value
var somethingValue = somethingProperty.GetValue(barValue);

// set the value
somethingProperty.SetValue(barValue, new List<int>());
Run Code Online (Sandbox Code Playgroud)

  • 实际上属性支持`GetValue()`方法,所以你不需要自己调用方法 (2认同)