Как управлять свойствами определенного пользователями класса на времени выполнения?

У меня есть огромное определенный пользователями , класс с большим количеством свойств и некоторыми из них должен быть установлен с определенной стоимостью.

Чтобы быть точнее, все общественные собственности с типом <сильной> последовательности в этом <сильном> определенный пользователями класс должны быть "освобожденных" в конце выполнения.

Таким образом, я достиг всех общественных собственностей один за другим (как 300 свойств) и назначил им с моими 300 линиями кода. То, что я сделал, чтобы решить эту проблему, сделало то, в чем я нуждался, но не удовлетворил меня, конечно.

Таким образом, я решил написать Вспомогательный метод (как Дополнительный Метод ) в C#, который повторяет через свойства экземпляра объекта, и доступ/управляют ими динамично. Я видел некоторые подобные вопросы о повторении через свойства в здесь, но ничего не видел о изменяющихся значениях свойств до сих пор. Вот то, что я попробовал:

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

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

Прокомментированная часть должна была быть линией, что я установил переменные, но это не было действительно историей успеха:) я буду ценить любую помощь.

0
nl ja de

4 ответы

Use PropertyInfo.SetValue method, more on this in here

2
добавлено

Можно использовать PropertyDescriptor Система. ComponentModel для ленивого кодирования. Принятие вас хочет повторить по <ним> общественный случай методы (не статика), можно попробовать следующий образец:

Test class:

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() Extension Method:

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 (этот объект o) и использовать его в качестве дополнительный метод для определенного экземпляра класса.

1
добавлено
    foreach (PropertyInfo property in aryProperties)
    {
        if (property.PropertyType == typeof(string) && property.CanWrite) 
        {
            property.SetValue(myObject, "", null);
        }
    }
0
добавлено

Вам нужен различный синтаксис, чтобы проверить имущественный тип; кроме того, вы, shold проверяют, что у собственности есть общественный сеттер.

if (property.PropertyType == typeof(string) && property.GetSetMethod() != null)
    property.SetValue(entityObject, "");
0
добавлено
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot