2014-10-14 3 views
0

Я надеюсь, что для этого вопроса я не получаю поток downvotes, но мне было интересно, есть ли способ использовать фактическое имя класса без вызова свойств, чтобы получить и установить значения. Так, например, если бы я иметь:Получение, установка значений с использованием имени класса

class Perfume 
{ 
    private string _aroma; 
    public string Aroma 
    { 
    set 
    { 
    _aroma = value; 
    } 
    } 
} 

Будут ли способ сделать:

Perfume perfume = new Perfume(); 
perfume = "Aroma"; // which will set _aroma to "Aroma"; 

?

+2

Вы можете создать новый '' Perfume': публичный статический неявный оператор Perfume (строка аромат) { вернуть новый Perfume {Аромат = аромат}; } ' –

ответ

5

Один из способов (что я бы не использовать), чтобы обеспечить implicit conversion от string до Perfume:

public static implicit operator Perfume(string aroma) 
{ 
    return new Perfume { Aroma = aroma }; 
} 

Тогда это работает:

Perfume perfume = new Perfume(); 
perfume = "aroma"; 

Но для этого нужно создать новый объект который редко желателен, так как он удаляет все другие свойства, а также делает код менее удобочитаемым (первая строка бессмысленна, так как она создает бросок-парфюм).

В качестве альтернативы, как правило, Aroma также будет классом со свойствами вместо string. Другой способ - предоставить enum доступных ароматов. Это повышает читаемость и делает код более надежным.

Но, возможно, вы действительно ищете способ найти свои ароматы через арома-название. Тогда Dictionary<string, Perfume> (или Dictionary<Aroma, Perfume>, где Aroma это перечисление) было бы более уместно:

Dictionary<string, Perfume> allAromas = new Dictionary<string, Perfume>(); 
allAromas.Add("Musky", new Perfume{Aroma="Musky"}); 
allAromas.Add("Putrid", new Perfume{Aroma="Putrid"}); 
allAromas.Add("Pungent", new Perfume{Aroma="Pungent"}); 
allAromas.Add("Camphoraceous", new Perfume{Aroma="Camphoraceous"}); 
allAromas.Add("Pepperminty", new Perfume{Aroma="Pepperminty"}); 

Теперь вы можете получить доступ к парфюм позже очень быстро с помощью арома-имя:

Perfume muskyPerfume = allAromas["Musky"]; 
+0

Ну, я думаю, это интересно, это можно сделать! Вероятно, не будет полезно создавать новый объект, когда вы делаете get вместо набора, используя этот метод, хотя, как вы говорите. – Tyress

+0

@Tyress: обратите внимание, что я отредактировал свой ответ. –

0

Существует стандартный способ настройки деталей.

Perfume perform = new Perfume(){ Aroma = "aroma" }; 

Или через впрыск конструктора, если вы добавляете новый конструктор, который является довольно стандартным.

Perfume perfume = new Perfume("Aroma"); 

public class Perfume 
{ 
    public string Aroma { get; set; } 

    public Perfume(string aroma) 
    { 
     Aroma = aroma; 
    } 
} 
+0

Я знаю это уже, но спасибо в любом случае! – Tyress

Смежные вопросы