Próbuję napisać ogólną metodę pobierania wartości XElement
w sposób mocno napisany. Oto co mam:Jak przesłać do ogólnego parametru w języku C#?
public static class XElementExtensions
{
public static XElement GetElement(this XElement xElement, string elementName)
{
// Calls xElement.Element(elementName) and returns that xElement (with some validation).
}
public static TElementType GetElementValue<TElementType>(this XElement xElement, string elementName)
{
XElement element = GetElement(xElement, elementName);
try
{
return (TElementType)((object) element.Value); // First attempt.
}
catch (InvalidCastException originalException)
{
string exceptionMessage = string.Format("Cannot cast element value '{0}' to type '{1}'.", element.Value,
typeof(TElementType).Name);
throw new InvalidCastException(exceptionMessage, originalException);
}
}
}
Jak widać na linii GetElementValue
First attempt
, staram się iść z łańcucha -> object -> TElementType. Niestety, to nie działa dla przypadku testowego typu integer. Kiedy uruchomiony następujący test:
[Test]
public void GetElementValueShouldReturnValueOfIntegerElementAsInteger()
{
const int expectedValue = 5;
const string elementName = "intProp";
var xElement = new XElement("name");
var integerElement = new XElement(elementName) { Value = expectedValue.ToString() };
xElement.Add(integerElement);
int value = XElementExtensions.GetElementValue<int>(xElement, elementName);
Assert.AreEqual(expectedValue, value, "Expected integer value was not returned from element.");
}
otrzymuję następujący wyjątek podczas GetElementValue<int>
nazywa się:
System.InvalidCastException : Cannot cast element value '5' to type 'Int32'.
będę musiał obsłużyć każdego odlewu sprawę (lub przynajmniej te liczbowe) osobno?
To działa dla mnie. 'ChangeType' zwraca obiekt nadal, ale domyślny rzut działa teraz. Dodatkowo, teraz sprawdzam 'FormatException' zamiast' InvalidCastException' w bloku 'try/catch'. Krótka i prosta odpowiedź. – Scott
Po dalszych badaniach nie można tego użyć z typami zerowymi. Więc używając tego artykułu: http://aspalliance.com/852 Napisałem metodę rozszerzenia do obsługi obu typów. – Scott