在我的函数中,我正在获取一个字符串。
但是,我想使用相同的函数返回int,bool或字符串。假设我通过其他功能获得了一个字符串:
public object read(string whatstring, string returnhow="string") {
object result = "a string gotten from another function";
switch(returnhow){
case "int":
result = int.TryParse(result, out result); break;
case "bool":
if (result=="0" || result=="false" || result=="") { returnthis = false; } else { returnthis = true; }; break;
default:
result = result.ToString(); break;
}
return result;
}
我想这样称呼它:
string thisvar = read("300", "int");
//or
bool thisvar = read("true", "string");
我不认为这是对的。我可以解决它,还是我走错了方向?
我确实得到了一个错误,我想因为我调用函数的方式 - 但你知道我想要什么。我希望它作为我声明返回值的type
返回。也许我的方向错了?
Cannot implicitly convert type 'object' to 'string'. An explicit conversion exists (are you missing a cast?)
答案 0 :(得分:3)
使用此功能。
public T ChangeType<T>(object value)
{
var converter = TypeDescriptor.GetConverter(typeof(T));
return converter != null && converter.CanConvertFrom(value.GetType())
? (T) converter.ConvertFrom(value) : default(T);
}
这适用于字符串作为源,但也支持任何其他源类型。只要有一个类型转换器,它可以转换,它将是。否则,您将获得默认值(即字符串为null,int为0,日期为DateTime.MinValue等)。
相同的代码,作为Object的扩展方法:
namespace System
{
public static class ObjectExtensions
{
public static T ChangeType<T<(this object value)
{
var converter = TypeDescriptor.GetConverter(typeof(T));
return converter != null && converter.CanConvertFrom(value.GetType())
? (T) converter.ConvertFrom(value) : default(T);
}
}
}
使用BCL内置类型转换的额外好处是,您可以通过为它们实现类型转换器来支持您想要的任何自定义类型。 MSDN有一个为Point类here实现此功能的示例。
另外,请参阅Scott Hanselman关于此概念的介绍性文章here。
答案 1 :(得分:1)
您可以使用与此类似的功能:
public object Convert(string toConvert, Type typeToConvert)
{
if(typeToConvert is string)
{
return toConvert;
}
else if(typeToConvert is bool)
{
bool convertedOutput;
if (bool.TryParse(toConvert, out convertedOutput))
{
return convertedOutput;
}
}
else if (typeToConvert is Int64 || typeToConvert is Int32 || typeToConvert is Int16)
{
Int64 convertedOutput;
if (Int64.TryParse(toConvert, out convertedOutput))
{
return convertedOutput;
}
}
// additional converts here...
return string.Empty;
}
答案 2 :(得分:1)
泛型可能是满足您要求的方式。有一个代码片段......
public T read<T>(string whatstring, string returnhow = "string")
{
T result = default(T) ;
// Do Something
return result;
}
祝你好运!
答案 3 :(得分:0)
以下是一个示例实现:
public static T GetByType<T> (string input) {
if(typeof(T) == typeof(string)) { return (T) Convert.ChangeType(input, typeof(T)); }
if(typeof(T) == typeof(Int32)) {
int output;
if(int.TryParse(input, out output)) { return (T) Convert.ChangeType(output, typeof(T)); }
}
if(typeof(T) == typeof(bool)) {
return (T) Convert.ChangeType(input == "1", typeof(T));
}
throw new ArgumentException("Invalid input");
}
工作示例:
void Main()
{
Console.WriteLine ("Calling with string:");
object type = GetByType<string>("0");
Console.WriteLine (type.GetType());
Console.WriteLine ("Calling with boolean:");
type = GetByType<bool>("0");
Console.WriteLine (type.GetType());
Console.WriteLine ("Calling with integer:");
type = GetByType<int>("0");
Console.WriteLine (type.GetType());
Console.WriteLine ("Calling with DateTime:");
type = GetByType<DateTime>("0");
Console.WriteLine (type.GetType());
}
输出: