我想添加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之外的其他值时,它将抛出异常。
答案 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.