변수를 런타임에만 알려진 유형으로 변환 하시겠습니까?


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

어떻게 캐스트 value할 수 paramType있습니까? valueA는 string, paramType아마 기본 유형처럼 될 것이다 int, string또는 어쩌면 float. 변환이 가능하지 않으면 예외를 던지는 것이 멋지다.




4
@MichaelFreidgeim의 의견은 이전 의견의 중복 가능성이 있습니다.
kmote

1
@kmote, "가능한 중복"주석은 일반적으로 누군가가 질문을 중복으로 닫기 위해 투표 할 때 자동으로 생성됩니다. 시스템이 첫 번째 댓글의 증분 투표 대신 동일한 댓글을 두 번째로 삽입 한 이유를 모르겠습니다. 이 '수'낮은 경우의 피를 가지고로 가장 오래된 코멘트가 수동으로 생성 할 수 있음
마이클 Freidgeim

@kmote, 그것은 알려진 문제입니다 meta.stackoverflow.com/questions/367526/...은
마이클 Freidgeim

답변:


89

사용중인 유형은 모두 IConvertible. 따라서 ChangeType.

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

13
굉장한 ... 한 줄로. var value = Convert.ChangeType (objectValue, objectType);
Rigin

17

당신은 역동적으로 갈 수 있습니다. 예를 들면 :

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; }
        }
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.