
[英]How do you create an array-like C# constructor that will allow “new MyClass() { obj1, obj2, obj3 };”
[英]C# Reflexion => PropertyInfo of indexed item of list (like obj1.List<obj3>[0])
我做了一个循环对象的方法,并返回他每个属性的PropertyInfo。
除了列表中的对象类型之外,所有其他都可以。
我需要返回列表中第一个(或下一个)对象的PropertyInfo;
例如,如果我将参数“ obj1.MyList [0]”放到我的方法中,它将返回obj3的PropertyInfo,因为MyList是类型“ List”的属性。
/// <summary>Récupère les meta-information de la propriétés "pPropertyName".</summary>
/// <returns>Item1=PropertyInfo, Item2=ObjetParent, Item3=ValeurDeLaPropriété</returns>
public static Tuple<PropertyInfo, object, object> GetPiByName(object pObj, string pPropertyName) {
PropertyInfo pi = null;
object val = pObj;
object valParent = null;
Type currentType = val.GetType();
var idx = -1;
foreach (string propertyName in pPropertyName.Split('.')) {
var posi = propertyName.IndexOf('[');
if ((posi>0) && int.TryParse(propertyName.Substring(posi + 1, propertyName.Length - propertyName.IndexOf(']')), out idx)) {
pi = currentType.GetProperty(propertyName.Substring(0, posi));
currentType = pi.PropertyType;
valParent = val;
val = pi.GetValue(val, null);
if ((val is IEnumerable) && (idx >= 0)) { // Pour les listes
valParent = val;
val = ((IList)val)[idx];
currentType = val.GetType();
pi = ??? [WHAT DO I PUT FOR RETURN PropertyInfo OF VAL] ???
idx = -1;
continue;
} // */
} else
pi = currentType.GetProperty(propertyName);
currentType = pi.PropertyType;
valParent = val;
val = pi.GetValue(val, null);
}
return new Tuple<PropertyInfo, object, object>(pi, valParent, val);
}
问候
我很确定您不能将列表的第3个元素定义为属性。
来自: https : //msdn.microsoft.com/zh-cn/library/x9fsa0sw.aspx
属性是提供灵活机制以读取,写入或计算私有字段的值的成员。 可以将属性当作公共数据成员使用,但实际上它们是称为访问器的特殊方法。 这使数据易于访问,并且仍然有助于提高方法的安全性和灵活性。
您能解释一下您需要什么吗?
obj1.MyList[0]
不是指一个属性-它指的是评估索引属性的吸气剂的结果MyList
带有参数0
。
语法a.prop[0]
只是a.prop.get_Item(0)
C#语法糖,其中get_Item
是编译器为索引器属性生成的getter方法。
您要实现的目标仅比要求int.Parse("123")
的MethodInfo
有效-您可以采用int.Parse
的MethodInfo
,而不能采用int.Parse("123")
的MethodInfo
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.