2010-10-24 16 views
60
foreach (var filter in filters) 
{ 
    var filterType = typeof(Filters); 
    var method = filterType.GetMethod(filter, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Static); 
    if (method != null) 
    { 
     var parameters = method.GetParameters(); 
     Type paramType = parameters[0].ParameterType; 
     value = (string)method.Invoke(null, new[] { value }); 
    } 
} 

Tôi có thể truyền value đến paramType bằng cách nào? valuestring, paramType có thể sẽ chỉ là một loại cơ bản như int, string hoặc có thể float. Tôi rất tuyệt khi nó ném một ngoại lệ nếu không thể chuyển đổi được.Chuyển đổi biến thành loại chỉ được biết trong thời gian chạy?

+1

có thể trùng lặp [Làm cách nào để tra cứu và gọi một .Net TypeConverter cho một loại cụ thể?] (http://stackoverflow.com/questions/956076/how-to-lookup-and-invoke -a-net-typeconverter-for-a-specific-type) –

+0

Có thể trùng lặp của [Cách tra cứu và gọi một .Net TypeConverter cho một loại cụ thể?] (http://stackoverflow.com/questions/956076/how- to-lookup-and-invoke-a-net-typeconverter-cho-a-cụ thể-type) –

Trả lời

62

Các loại bạn đang sử dụng tất cả triển khai IConvertible. Như vậy bạn có thể sử dụng ChangeType.

value = Convert.ChangeType(method.Invoke(null, new[] { value }), paramType); 
+7

tuyệt vời ... trong một dòng. var value = Convert.ChangeType (objectValue, objectType); – Rigin

12

Bạn có thể hoạt động; ví dụ:

using System; 

namespace TypeCaster 
{ 
    class Program 
    { 
     internal static void Main(string[] args) 
     { 
      Parent p = new Parent() { name = "I am the parent", type = "TypeCaster.ChildA" }; 
      dynamic a = Convert.ChangeType(new ChildA(p.name), Type.GetType(p.type)); 
      Console.WriteLine(a.Name); 

      p.type = "TypeCaster.ChildB"; 
      dynamic b = Convert.ChangeType(new ChildB(p.name), Type.GetType(p.type)); 
      Console.WriteLine(b.Name); 
     } 
    } 

    internal class Parent 
    { 
     internal string type { get; set; } 
     internal string name { get; set; } 

     internal Parent() { } 
    } 

    internal class ChildA : Parent 
    { 
     internal ChildA(string name) 
     { 
      base.name = name + " in A"; 
     } 

     public string Name 
     { 
      get { return base.name; } 
     } 
    } 

    internal class ChildB : Parent 
    { 
     internal ChildB(string name) 
     { 
      base.name = name + " in B"; 
     } 

     public string Name 
     { 
      get { return base.name; } 
     } 
    } 
} 
Các vấn đề liên quan