[英]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.