変数を実行時にのみ認識されるタイプに変換しますか?


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

私はどのようにキャストすることができますvalueするにはparamTypevaluestringparamTypeおそらくちょうどのような基本的な型になりますintstringまたは多分float。変換が不可能な場合に例外をスローするのはクールです。




4
@MichaelFreidgeimのコメントは、前のコメントと重複している可能性があります。
kmote

1
@kmoteの場合、「重複の可能性がある」コメントは通常、誰かが質問を重複として閉じることに投票すると自動的に生成されます。システムが最初のコメントの増分投票ではなく、同じコメントを2回挿入した理由がわかりません。'possible'に小文字のpが含まれているため、最も古いコメントが手動で作成された可能性があります
MichaelFreidgeim19年

@kmote、それは既知の問題のあるmeta.stackoverflow.com/questions/367526/...
マイケルFreidgeim

回答:


88

使用しているタイプはすべて実装されていIConvertibleます。そのため、を使用できますChangeType

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

12
素晴らしい...一行で。var value = Convert.ChangeType(objectValue、objectType);
Rigin 2016年

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.