我想创建一个实现IEnumerable <T>的类,但是,使用反射生成T并通过IEnumerable <T>返回它们,其中T'是T的完全构造的子类,其中一些属性被隐藏而其他属性是只读的。
好吧,那可能不太清楚。让我通过代码介绍解释一下 - 我想要一个类CollectionView <T>如下: -
public class CollectionView<T> : IEnumerable<T> {
public CollectionView(IEnumerable<T> inputCollection,
List<string> hiddenProperties, List<string> readonlyProperties) {
// ...
}
// IEnumerable<T> implementation which returns a collection of T' where T':T.
}
...
public class SomeObject {
public A { get; set; }
public B { get; set; }
public C { get; set; }
}
...
var hiddenProperties = new List<string>(new[] { "A" });
var readOnlyProperties = new List<string>(new[] { "C" });
IEnumerable<SomeObject> someObjects = CollectionView<SomeObject>(hiddenProperties,
readOnlyProperties);
...
dataGridView1.DataSource = someObjects;
(当在dataGridView1中显示时,显示列B和C,并且C具有只读的基础存储)
这是可能的/可取的还是我完全忘记了/这个问题是否证明了我作为程序员的深刻不足?
我想这样做,所以我可以操作一个要传递给DataGridView的集合,而不必直接操作DataGridView来隐藏列/使列只读。所以没有'哦,只需使用dataGridView1.Columns.Remove(blah)/ dataGridView1.Columns [blah] .ReadOnly = true'请回答!
救命!
发布于 2019-05-23 08:54:30
即使通过创建子类代理,您也无法隐藏属性。你至少可以动态地构造一个不同的类型,它拥有良好的属性,但它不会是一个T
。
但是,如果您只需要使用数据绑定,则返回对象列表就足够了。
发布于 2019-05-23 10:16:50
Castle.DynamicProxy将帮助您实现这一目标。你要做的是创建一个继承T的拦截器。你将存储隐藏和只读属性的集合。当调用getter或setter时,拦截器将检查该属性是否存在于任一集合中,然后采取适当的操作。
但是,我不知道你将如何隐藏财产。您无法更改派生类中基类的访问修饰符。您可以使用new
关键字,但我不知道如何使用Castle.DynamicProxy。
https://stackoverflow.com/questions/-100001197
复制相似问题