[C#] C#:如何获取类型的所有公共(包括get和set)字符串属性


Answers

你可以通过BindingFlags.Public | BindingFlags.Instance找到属性 BindingFlags.Public | BindingFlags.Instance 。 然后,您将需要通过检查CanWrite和CanRead属性来检查每个PropertyInfo实例,以确定它们是否可读和/或可写。

更新:代码示例

PropertyInfo[] props = yourClassInstance.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
for (int i = 0; i < props.Length; i++)
{
    if (props[i].PropertyType == typeof(string) && props[i].CanWrite)
    {
        // do your update
    }
}

更新之后,我会更详细地研究它。 如果你也检查由GetGetMethod和GetSetMethod返回的MethodInfo对象,你会打到目标,我想;

 var properties = typeof(TestSubject).GetProperties(BindingFlags.Instance | BindingFlags.Public)
        .Where => ø.CanRead && ø.CanWrite)
        .Where => ø.PropertyType == typeof(string))
        .Where => ø.GetGetMethod(true).IsPublic)
        .Where => ø.GetSetMethod(true).IsPublic);

默认情况下,这两个方法只返回公有的getter和setter(在这种情况下冒着NullReferenceException风险),但是如上所述传递true也会返回私有的。 然后,您可以检查IsPublic (或IsPrivate )属性。

Question

我试图做一个方法,将通过通用对象的列表,并替换所有他们的属性类型stringnull或空替换。

如何做到这一点的好方法?

我有这种...壳...迄今为止:

public static void ReplaceEmptyStrings<T>(List<T> list, string replacement)
{
    var properties = typeof(T).GetProperties( -- What BindingFlags? -- );

    foreach(var p in properties)
    {
        foreach(var item in list)
        {
            if(string.IsNullOrEmpty((string) p.GetValue(item, null)))
                p.SetValue(item, replacement, null);
        }
    }
}

那么,我如何找到一个类型的所有属性:

  • string的类型
  • 公众get
  • 有公共set

我做了这个测试课:

class TestSubject
{
    public string Public;
    private string Private;

    public string PublicPublic { get; set; }
    public string PublicPrivate { get; private set; }
    public string PrivatePublic { private get; set; }
    private string PrivatePrivate { get; set; }
}

以下不起作用:

var properties = typeof(TestSubject)
        .GetProperties(BindingFlags.Instance|BindingFlags.Public)
        .Where => ø.CanRead && ø.CanWrite)
        .Where => ø.PropertyType == typeof(string));

如果我打印出那些属性的名称,我会得到:

公共公共私有私有公共

换句话说,我得到两个属性太多了。

注意 :这可能会以更好的方式完成...使用嵌套的foreach和反射和所有这里...但如果你有任何伟大的替代想法,请让我知道,因为我想学习!




我建议一个不同的方法: AOP
您可以拦截setter并将所需值设置为有效值。 使用PostSharp很容易。