2016-07-07 128 views
-1

我有一個ConvertMethods類可以動態調用。C#反射 - 投射參數到類型

public class ConvertMethods 
{ 
    public ConvertMethods() 
    { 
     Type type = typeof(ConvertMethods); 
     methodInfos = type.GetMethods(BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly); 
    } 

    public Type GetParameterType(string methodName) 
    { 
     foreach (var method in methodInfos) { 
      if (method.Name == methodName) { 
       return method.GetParameters()[0].GetType(); 
      } 
     } 

     throw new MissingMethodException("ConvertMethods", methodName); 
    } 

    public Type GetReturnType(string methodName) 
    { 
     foreach (var method in methodInfos) { 
      if (method.Name == methodName) { 
       return method.ReturnType; 
      } 
     } 

     throw new MissingMethodException("ConvertMethods", methodName); 
    } 

    public object InvokeMethod(string methodName, object parameter) 
    { 
     foreach (var method in methodInfos) { 
      if (method.Name == methodName) { 
       return InvokeInternal(method, parameter); 
      } 
     } 

     throw new MissingMethodException("ConvertMethods", methodName); 
    } 

    public static TimeSpan SecondsToTimeSpan(long seconds) 
    { 
     return TimeSpan.FromSeconds(seconds); 
    } 

    private object InvokeInternal(MethodInfo method, object parameter) 
    { 
     return method.Invoke(null, new[] { parameter }); 
    } 

    private MethodInfo[] methodInfos; 
} 

潛在地,需要轉換的每個值都以字符串形式從數據庫中轉換而來。我想動態地將其轉換/轉換爲Invoked方法的參數類型。這裏是我有:

class Program 
{ 
    static void Main(string[] args) 
    { 
     string methodName = "SecondsToTimeSpan"; 
     string value = "10"; 

     ConvertMethods methods = new ConvertMethods(); 
     Type returnType = methods.GetReturnType(methodName); 
     Type paramType = methods.GetParameterType(methodName); 

     object convertedParameter = (paramType)value; // error on this line 

     var result = methods.InvokeMethod(methodName, convertedParameter); 

     Console.WriteLine(result.ToString()); 
    } 
} 

我財產轉換或如何轉換String value到任何類型paramType包含?

回答

1
object convertedParameter = TypeDescriptor.GetConverter(paramType).ConvertFromString(value); 

會做你想做的。

+0

這隻適用於那些有'TypeConverterAttrribute'類型的人,但並非所有人都這麼做。 – GreatAndPowerfulOz

+0

不,它適用於很多內置類型 –

+0

當然,所有那些Convert.ChangeType都適用。 –