0

我有一个巨大的用户定义类,其中包含很多属性,其中一些必须设置为某个值。

更具体地说,该用户定义类中所有字符串类型的公共属性必须在执行结束时“清空” 。

因此,我一一访问了所有公共属性(例如 300 个属性),并为它们分配了我的 300 行代码。我做了什么来解决这个问题,做了我需要的,但当然没有让我满意。

所以我决定在 C# 中编写一个Helper Method(作为Extension Method),它遍历对象实例的属性并动态访问/操作它们。我在这里看到了一些关于迭代属性的类似问题,但到目前为止还没有看到任何关于更改属性值的内容。这是我尝试过的:

public static void SetDefaultStringValues(this Object myObject)
{
    PropertyInfo[] aryProperties = entityObject.GetType().GetProperties();

    foreach (object property in aryProperties)
    {
        if (property is String) 
        {
            //property = String.Empty;
        }
    }
}

评论部分必须是我设置变量的那一行,但这并不是一个真正的成功案例:)我将不胜感激。

4

4 回答 4

2

使用 PropertyInfo.SetValue 方法,更多内容在这里

于 2013-02-07T11:35:03.163 回答
1

您可以使用PropertyDescriptorofSystem.ComponentModel进行惰性编码。假设您要迭代公共实例方法(不是静态方法),您可以尝试以下示例:

测试

public class TestClass
{
    private int mIntMemeber = 0;                    // # to test int type   
    private string mStringMember = "abc";           // # to test string type (initialized)
    private string mNullStringMember = null;        // # to test string type (null)

    private static string mStaticNullStringMember;  // # to test string type (static)

    // # Defining properties for each member
    public int IntMember                            
    {
        get { return mIntMemeber; }
        set { mIntMemeber = value; }                
    }

    public string StringMember                      
    {
        get { return mStringMember; }
        set { mStringMember = value; }
    }

    public string NullStringMember
    {
        get { return mNullStringMember; }
        set { mNullStringMember = value; }
    }

    public static string StaticNullStringMember
    {
        get { return mStaticNullStringMember; }
        set { mStaticNullStringMember = value; }
    }
}

SetDefaultStringValues() 扩展方法

public static string SetDefaultStringValues(this TestClass testClass)   
{
    StringBuilder returnLogBuilder = new StringBuilder();
    // # Get all properties of testClass instance
    PropertyDescriptorCollection propDescCollection = TypeDescriptor.GetProperties(testClass);
    // # Iterate over the property collection
    foreach (PropertyDescriptor property in propDescCollection)
    {
        string name = property.Name;
        Type t = property.PropertyType; // # Get property type
        object value = property.GetValue(testClass); // # Get value of the property (value that member variable holds)

        if (t == typeof(string)) // # If type of propery is string and value is null
        {
            property.SetValue(testClass, String.Empty); // # Set value of the property (set member variable)
            value = String.Empty; // # <-- To prevent NullReferenceException when printing out
        }

        returnLogBuilder.AppendLine("*****\nName:\t{0}\nType:\t{1}\nValue:\t{2}", name, t.ToString(), value.ToString());
    }

    returnLogBuilder.AppendLine("*****");
    return returnLogBuilder.toString();
}

您还可以检查循环中的是否为空。SetDefaultStringValues方法参数可以是任何对象实例。您可以将其更改为SetDefaultStringValues(this object o)并将其用作定义的类实例的扩展方法

于 2013-02-07T12:35:22.557 回答
0

您需要不同的语法来检查属性类型;此外,您应该检查该属性是否具有公共设置器。

if (property.PropertyType == typeof(string) && property.GetSetMethod() != null)
    property.SetValue(entityObject, "");
于 2013-02-07T11:39:41.023 回答
0
    foreach (PropertyInfo property in aryProperties)
    {
        if (property.PropertyType == typeof(string) && property.CanWrite) 
        {
            property.SetValue(myObject, "", null);
        }
    }
于 2013-02-07T11:48:13.137 回答