C # установка свойств класса по имени строки в create - PullRequest
0 голосов
/ 08 октября 2018

У меня есть следующий пример класса:

public class Foo
{
    public int Id { get; set; }

    public string Bar { get; set; }
    public string FooBar { get; set; }
    public string Fizz { get; set; }
    public string Buzz { get; set; }

    public static Foo Create(int id, string property, string value)
    {
        return new Foo
        {
            Id = id,

        };
    }
}

Теперь, однако, я хочу установить, например, только Bar на значение в методе Create класса, еслиимя свойства Bar .Итак, я взглянул на C # установку / получение свойств класса по строковому имени , но я не могу заставить это работать в методе create.То же самое относится и к Установка свойства с помощью отражения со строковым значением , так что я немного заблудился здесь.

В качестве небольшого уточнения.Я могу заставить вышеуказанные методы работать в процессе создания, но не в возврате, в котором он должен работать.

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

public class Foo
{
    public int Id { get; set; }

    public string Bar { get; set; }
    public string FooBar { get; set; }
    public string Fizz { get; set; }
    public string Buzz { get; set; }

    public static Foo Create(int id, string property, string value)
    {
        return new Foo
        {
            WebshopCustomerId = webshopCustomerId,
            Bar = (typeof(Foo)).GetProperty(property).Name == "Bar" ? value : null,
            FooBar = (typeof(Foo)).GetProperty(property).Name == "FooBar" ? value : null,
            Fizz = (typeof(Foo)).GetProperty(property).Name == "Fizz" ? value : null,
            Buzz = (typeof(Foo)).GetProperty(property).Name == "Buzz" ? value : null,
        };
    }
}

Ответы [ 3 ]

0 голосов
/ 08 октября 2018
public static Foo Create(int id, string property, string value)
{
    Foo ret = new Foo
    {
        Id = id
    };
    foreach (FieldInfo element in typeof(Foo).GetFields())
        if (element.Name == property)
            element.SetValue(ret, value);
    foreach (PropertyInfo element in typeof(Foo).GetProperties())
        if (element.Name == property)
            element.SetValue(ret, value);
    return ret;
}

Что-то похожее на это должно работать для вас, вы также можете использовать

ret.GetType().GetProperty(property).SetValue(ret, value);
ret.GetType().GetField(property).SetValue(ret, value);

Но вам придется обрабатывать ошибки.

0 голосов
/ 08 октября 2018

Вы можете избежать размышлений и упростить все, используя словарь Action s:

public class Foo
{
    public int Id { get; set; }

    public string Bar { get; set; }
    public string FooBar { get; set; }
    public string Fizz { get; set; }
    public string Buzz { get; set; }

    private static Dictionary<string, Action<Foo, string>> _propertySetters =
        new Dictionary<string, Action<Foo, string>>()
        {
            { "Bar", (foo, value) => foo.Bar = value },
            { "FooBar", (foo, value) => foo.FooBar = value },
            { "Fizz", (foo, value) => foo.Fizz = value },
            { "Buzz", (foo, value) => foo.Buzz = value },
        };

    public static Foo CreateWithProperty(int id, string property, string value)
    {
        if (String.IsNullOrEmpty(property) || !_propertySetters.ContainsKey(property))
            throw new ArgumentException("property");

        var instance = new Foo { Id = id };

        var setter = _propertySetters[property];

        setter(instance, value);

        return instance;
    }
}

. При таком подходе вы даже можете изменять имена свойств, сохраняя значения конфигурации одинаковыми.В зависимости от ситуации это может быть огромным преимуществом.

Сказав это, я чувствую, , что на ваше требование, вероятно, можно было бы лучше ответить с помощью дополнительной контекстной информации и немного другого дизайна.YMMV.

0 голосов
/ 08 октября 2018

Это будет работать для вас, но вам все равно нужно проверить, является ли property допустимым свойством.

       public static Foo Create(int id, string property, string value)
       {
           Foo foo = new Foo() { Id = id };

           PropertyInfo propertyInfo = foo.GetType().GetProperty(property);
           propertyInfo.SetValue(foo, Convert.ChangeType(value, propertyInfo.PropertyType), null);
           return foo;
       }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...