Chuyển đổi biến thành kiểu chỉ biết tại thời điểm chạy?


83
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 });
    }
}

Làm thế nào tôi có thể truyền valueđến paramType? valuelà một string, paramTypecó thể sẽ chỉ là một loại hình cơ bản như int, string, hoặc có thể float. Tôi rất tuyệt khi nó đưa ra một ngoại lệ nếu không có khả năng chuyển đổi.




4
Nhận xét của @ MichaelFreidgeim có thể trùng lặp với nhận xét trước đó.
— kmote

1
@kmote, nhận xét "có thể trùng lặp" thường được tạo tự động khi ai đó bỏ phiếu để đóng câu hỏi là trùng lặp. Không chắc tại sao hệ thống lại chèn cùng một nhận xét lần thứ hai thay vì tăng phiếu bầu của nhận xét đầu tiên. Có thể nhận xét lâu đời nhất được tạo ra bằng tay, vì nó có hợp cụ thể thấp p trong 'có thể'
— Michael Freidgeim

@kmote, đây là một vấn đề đã biết meta.stackoverflow.com/questions/367526/…
— Michael Freidgeim

Câu trả lời:


88

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

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

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

17

Bạn có thể đi năng độ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; }
        }
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.