我试图在我的代码中使用Reflection1示例实现数据转换。

GetSourceValue函数有一个比较各种类型的开关,但我想删除这些类型和属性,并让GetSourceValue只使用一个字符串作为参数来获取属性的值。我想在字符串中传递一个类和属性,并解析属性的值。

这可能吗?

1原始博客文章的Web存档版本


当前回答

public class YourClass
{
    //Add below line in your class
    public object this[string propertyName] => GetType().GetProperty(propertyName)?.GetValue(this, null);
    public string SampleProperty { get; set; }
}

//And you can get value of any property like this.
var value = YourClass["SampleProperty"];

其他回答

如果我用Ed s的密码,我就

“ReflectionExtensions。由于其保护级别,GetProperty(Type, string)'不可访问

似乎GetProperty()在Xamarin.Forms中不可用。TargetFrameworkProfile是我的便携式类库中的Profile7。NET Framework 4.5, Windows 8, ASP。NET Core 1.0, Xamarin。Android, Xamarin的。Xamarin的iOS。iOS经典)。

现在我找到了一个可行的解决方案:

using System.Linq;
using System.Reflection;

public static object GetPropValue(object source, string propertyName)
{
    var property = source.GetType().GetRuntimeProperties().FirstOrDefault(p => string.Equals(p.Name, propertyName, StringComparison.OrdinalIgnoreCase));
    return property?.GetValue(source);
}

Dim NewHandle As YourType = CType(Microsoft.VisualBasic.CallByName(ObjectThatContainsYourVariable, "YourVariableName", CallType), YourType)

下面的方法非常适合我:

class MyClass {
    public string prop1 { set; get; }

    public object this[string propertyName]
    {
        get { return this.GetType().GetProperty(propertyName).GetValue(this, null); }
        set { this.GetType().GetProperty(propertyName).SetValue(this, value, null); }
    }
}

获取属性值:

MyClass t1 = new MyClass();
...
string value = t1["prop1"].ToString();

设置属性值。

t1["prop1"] = value;

您从未提及您正在检查的对象,由于您拒绝引用给定对象的对象,因此我假定您指的是静态对象。

using System.Reflection;
public object GetPropValue(string prop)
{
    int splitPoint = prop.LastIndexOf('.');
    Type type = Assembly.GetEntryAssembly().GetType(prop.Substring(0, splitPoint));
    object obj = null;
    return type.GetProperty(prop.Substring(splitPoint + 1)).GetValue(obj, null);
}

注意,我用局部变量obj标记了正在检查的对象。Null表示静态,否则将其设置为您想要的值。还要注意,GetEntryAssembly()是获得“正在运行”的程序集的几个可用方法之一,如果你在加载类型时遇到困难,你可能想要使用它。

关于嵌套属性的讨论,如果使用DataBinder,就可以避免所有反射的问题。Eval方法(对象,字符串)如下:

var value = DataBinder.Eval(DateTime.Now, "TimeOfDay.Hours");

当然,您需要添加对系统的引用。Web汇编,但这可能不是一个大问题。