许多类型的数组集合C#

时间:2016-03-07 11:09:13

标签: c# reflection

我想添加Object尽可能多的类型。我已经搜索了这个特殊问题,但我找不到任何关于这种情况的帮助。假设我有一个按钮点击事件,它有很多类型,定义如下

  object[] InvokeParam = null;
    private void btnCall_Click(object sender, EventArgs e)
    {
        string t = "";
        int t1 = 0;
        float t2 = 0.2;
        InvokeParam = new object[3];
        string type = RecognizeType(t.GetType(),0);
        string type1 = RecognizeType(t1.GetType(), 1);
        string type2 = RecognizeType(t2.GetType(), 2);
    }

和RecognizeType函数是

 private string RecognizeType(Type type,int Index)
    { 
        string typename = "";

        if (type.Equals(typeof(string)))
        {
            //InvokeParam[Index] = type as string;
            typename = "String";
        }
        else if (type.Equals(typeof(int)))
        {
            typename = "Int";
        }
        else if (type.Equals(typeof(double)))
        {
            typename = "Double";
        }
        else if (type.Equals(typeof(Single)))
        {
            typename = "Single";
        }
        else if (type.Equals(typeof(float)))
        {

            typename = "Float";
        }
        else if (type.Equals(typeof(decimal)))
        {
            typename = "Decimal";
        }
        else
        {
            typename = "Another Type";
        }

        return typename;
    }

我希望数组中的每个对象都是特定的Type。如果第一个是string类型,那么它可以将object的索引作为字符串,因此每当用户输入任何值时,当输入除string之外的其他值时,它将抛出异常。

1 个答案:

答案 0 :(得分:2)

如果我正确理解您的问题 - 您希望使用初始类型设置数组中的每个值,然后在该位置仅允许该类型。

我认为这个问题可以用一个简单的类来解决:

public class TypeMapper
{
    public readonly Type Type;
    object _value;
    public object Value
    {
        get { return _value; }
        set
        {
            // If Type is null, any type is permissable. 
            // Else check that the input value's type matches Type.
            if (Type == null || value.GetType().Equals(Type))
                _value = value;
            else
                throw new Exception("Invalid type.");
        }
    }

    static Dictionary<string, Type> _types = new Dictionary<string, Type>()
    {
        { "string", typeof(string) },
        { "int", typeof(int) },
        { "double", typeof(double) },
    };

    public TypeMapper(string type)
    {
        // If 'type' is not described in _types then 'Type' is null
        // - any type is permissable.
        _types.TryGetValue(type, out Type);
    }
}

然后您可以按如下方式使用此类:

object[] InvokeParam = new TypeMapper[2];
InvokeParam[0] = new TypeMapper("string");
(InvokeParam[0] as TypeMapper).Value = "Hello World"; // Ok
(InvokeParam[0] as TypeMapper).Value = 123; // Throws exception.
InvokeParam[1] = new TypeMapper("double");
(InvokeParam[1] as TypeMapper).Value = 123.456; // Ok
(InvokeParam[1] as TypeMapper).Value = false; // Throws exception.