繁体   English   中英

C#通过反射为元组构造默认对象

[英]C# Construct a default object for a Tuple by reflection

在我的C#应用​​程序中,我需要创建一个元组的实例。 但是这里有个问题-我不只在运行时预先知道Tuple类型。 如果我有方法可以创建可能在Tuple中存在的任何类型的实例,那么有没有办法使用反射来创建这样的Tuple实例? 例如,我正在考虑以下方面,但无法使其正常工作:

if (type typeof(Tuple))
{
    FieldInfo[] fieldInfoArray = type.GetFields();
    object[] = CreateArrayOfObjectsFromFieldInfoArray(fieldInfoArray);
    return new Tuple(objectArray);
}

有一个更好的方法吗?

您可以使用Tuple.Create方法比使用构造函数更容易地构造对象(既可以静态编写代码,也可以使用反射)。 您可以使用FieldInfo对象找出要调用的Create重载,然后传入调用该重载时所拥有的值。

FieldInfo[] fieldInfoArray = type.GetFields();
object[] values = CreateArrayOfObjectsFromFieldInfoArray(fieldInfoArray);
Type[] typeArguments = fieldInfoArray.Select(fieldInfo => fieldInfo.FieldType).ToArray();
return typeof(Tuple).GetMethods()
    .FirstOrDefault(method => method.Name == "Create" && method.GetParameters().Length == typeArguments.Length)
    ?.MakeGenericMethod(typeArguments)
    ?.Invoke(null, values);

我无法在工作的第一个答案中得到代码,但是经过反复试验后,我得到了以下工作:

Type[] typeArray = type.GetGenericArguments();
object[] values = CreateArrayOfObjectsFromFieldInfoArray(typeArray);
defaultObject = type.GetConstructor(typeArray)?.Invoke(values);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM