Moja intuicja podpowiada mi, że próbujesz przekonwertować wartość ciągu na jakiś typ. W takim przypadku można użyć:
public T UpdateMapFetcher<T>(int stationID)
{
//var someValue = "23";
return (T)Convert.ChangeType(someValue, typeof(T));
}
//then
var typed = UpdateMapFetcher<int>(6);
w przypadku, gdy nie wiem, T, można użyć mapowania (0-int, 1-ciąg, etc.):
public object UpdateMapFetcher(int stationID, int type)
{
var typeMap = new []{ typeof(int), typeof(string)};
//var someValue = "23";
return Convert.ChangeType(someValue, typeMap[type]);
}
//then
var untyped = UpdateMapFetcher(6, 0/*0 is int*/);
if (untyped.GetType() == typeof(int))
{ /*is int*/
}
Innym rozwiązaniem jest użycie niejawne konwersje:
public class StringOrInt
{
private object value;
public ValueType Type { get; set; }
public static implicit operator StringOrInt(string value)
{
return new StringOrInt()
{
value = value,
Type = ValueType.String
};
}
public static implicit operator StringOrInt(int value)
{
return new StringOrInt()
{
value = value,
Type = ValueType.Int
};
}
public static implicit operator int(StringOrInt obj)
{
return (int)obj.value;
}
public static implicit operator string(StringOrInt obj)
{
return (string)obj.value;
}
}
public enum ValueType
{
String,
Int
}
A potem (simplifié d):
public static StringOrInt UpdateMapFetcher(int stationID, int typeID)
{
if (typeID == 0)
return "Text";
return 23;
}
private static void Main(string[] args)
{
var result = UpdateMapFetcher(1, 1);
if (result.Type == ValueType.String) { }//can check before
int integer = result;//compiles, valid
string text = result;//compiles, fail at runtime, invalid cast
}
Can lepiej opisać, dlaczego tego właśnie potrzebujesz? (Zawsze możesz zwrócić 'obiekt', ale myślę, że powinieneś przemyśleć nieco projekt) –
' var' jest po prostu "kompilatorem, proszę sprawdź poprawny typ danych i umieść go tutaj". Musi jeszcze zostać ustalony * podczas kompilacji *. –