[c#] C#:如何获取类型的所有公共(获取和设置)字符串属性



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

我试图创建一个方法,将通过一个通用对象列表,并替换所有类型string的属性,其中null或空替换。

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

我有这种... shell ...到目前为止:

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
  • 有公共场合

我做了这个测试课程:

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));

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

PublicPublic PublicPrivate PrivatePublic

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

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




我建议采用不同的方法: AOP
您可以截取setter并将所需的值设置为有效值。 使用PostSharp它非常简单。







Links