2009-04-14 10 views
8

To może być trochę anty-wzór, ale jest możliwe, aby właściwość klasy C# akceptowała wiele wartości?Czy właściwość C# może przyjmować wiele wartości?

Załóżmy na przykład, że mam właściwość Int publiczną i zawsze chcę, aby zwracała int, ale chciałbym mieć możliwość ustawienia właściwości poprzez przypisanie wartości dziesiętnej, liczby całkowitej lub innego typu danych. Moje pytanie brzmi, czy to możliwe, aby właściwości akceptowały wiele wartości?

Odpowiedz

10

myślę, co masz na myśli zadać jest: Jak implicit i explicit rzucania pracy na int i decimal?

Pytasz o domyślny rzut, który automatycznie zakrywa jeden obiekt do innego zdefiniowanego typu. Nie będziesz w stanie tego zrobić dla int i decimal, ponieważ są one już zdefiniowane w ramach i nie można zmniejszyć zakresu decimal, przesyłając go do int. Ale jeśli używałeś tego jako przykładu dla rzeczywistych obiektów, które stworzyłeś, możesz użyć powyższego linku implicit, aby dowiedzieć się więcej o tym, jak to działa i jak go wdrożyć.

Ale zawsze możesz użyć metody convert, aby przekonwertować je na właściwy typ;

public int MyProperty { get; set; } 
... 
obj.MyProperty = Convert.ToInt32(32.0M); 
obj.MyProperty = Convert.ToInt32(40.222D); 
obj.MyProperty = Convert.ToInt32("42"); 
+0

Używałem bardziej ints i dziesiętnych jako przykład, ale jest on powiązany. Zasadniczo chcę tylko móc przypisać wiele różnych typów do jednej właściwości i pozwolić, aby własność wyszukała, co zwrócić. Jak wspomniałeś, pozwala na to niejawny casting. – lomaxx

+0

Jedyną rzeczą, którą dodam, jest to, że podczas gdy domyślne rzutowanie rozwiąże problem, wydaje się, że nie ogranicza to w wystarczającym stopniu zakresu. Będzie działał dobrze, jeśli chodzi o to, co próbuję zrobić, ale widzę potencjalne problemy z im (ex) nieostrym rzutowaniem, jeśli potrzebuję konkretnych reguł dla każdej obsady. – lomaxx

+0

Mimo wszystko, nadal uważam, że próbuję to zrobić, to anty-wzorzec i prawdopodobnie lepiej byłoby zrobić to w dynamicznym języku, w którym mogę przypisać to, co chcę, lub przemyśleć to, co robię. aby uniknąć problemu. – lomaxx

-1

Właściwości mają wyglądać jak pola publiczne. Twórz metody ustawiające lub wykonaj rzutowanie/konwersję w instrukcjach przypisania, w odróżnieniu od ustawiania właściwości.

0

Nie Właściwość ma jedną wartość. Możesz przydzielić cokolwiek, co można przypisać do zmiennej tego samego typu.

+0

To nie jest prawda, można przypisać je do dowolnego obiektu, na który można wyraźnie rzutować. –

+0

@Nick Berardi: To nie jest dokładne. Po oddaniu go do innego typu przypisujesz inny typ! –

+0

@John: Zgoda, nie wiem, co Nick pali. – Samuel

1

Wygląda na to, że będziesz musiał sprawdzić typ w czasie wykonywania. Możesz mieć właściwość akceptować obiekt, określić typ i podjąć działania. Musiałbyś rzucić wyjątki na rzeczy, których się nie spodziewasz. Tak jak mówisz, prawdopodobnie nie najlepszy, ale możliwy. :)

2

Edycja: Metoda ta nie może być używane, ponieważ PO jest szczególnie związany z właściwościami.

Nie wierzę, że jest to możliwe dzięki solidności, którą opisujesz. W takim przypadku lepiej byłoby zastosować przeciążoną metodę (polimorfizm).

To jest typowe ustawienie (lub mutatora) i można przeciążać metodę, aby akceptować wiele różnych typów parametrów. Każda z nich wykona inaczej, jeśli chcesz. Sposób, w jaki je skonfigurowałem, może nie być poprawny pod względem składni, ale taki jest ogólny pomysł, w który wierzę.

public class MyClass { 
    private Int32 mySomeValue; 
    public void setSomeValue(Double value) { this.mySomeValue = Convert.ToInt32(value); } 
    public void setSomeValue(Int32 value) { this.mySomeValue = value; } 
} 
Powiązane problemy