是否可以在运行时添加属性或在运行时更改属性的值?可以在C#中动态添加属性吗?
回答
属性是静态元数据。组件,模块,类型,成员,参数和返回值不是C#中的第一类对象(例如,System.Type
类仅仅是类型的反映表示)。您可以获取某个类型的属性实例,并在属性可写的情况下更改这些属性,但不会影响该属性应用于此类型。
我不这么认为。即使我错了,你所希望的最好的结果就是将它们添加到整个类型中,而不是类型的实例。
不,不是。
属性是元数据,并以二进制形式存储在已编译的程序集中(这也是为什么您只能在其中使用简单类型)。
你不能。一种解决方法可能是在运行时生成派生类并添加属性,但这可能有点矫枉过正。
如果你需要能够动态添加的东西,c#属性不是这样。看看将数据存储在xml中。我最近做了一个项目,我开始w /属性,但最终移动到序列化w/xml。
为什么你需要?属性为反射提供了额外的信息,但是如果你从外部知道你想要的属性,则不需要它们。
您可以在外部相对容易地将元数据存储在数据库或资源文件中。
消除锅炉板。如果您可以让类根据类中的代码自动生成属性,那不是很方便吗?我试图找出这样的东西来减少SQL CLR对象中的样板。在其他语言中很容易......见http://www.paulgraham.com/avg.html – 2011-05-31 01:30:52
这实际上取决于你想要完成什么。
System.ComponentModel.TypeDescriptor东西可以用来为类型,属性和对象实例添加属性,它也有限制,你必须使用它来检索这些属性。如果你正在编写使用这些属性的代码,并且你可以在这些限制之内生活,那么我肯定会建议它。
据我所知,PropertyGrid控件和Visual Studio设计界面是BCL中唯一使用TypeDescriptor的东西。事实上,这就是他们如何处理他们真正需要做的一半事情。
好吧,为了不同,我找到了一篇引用Reflection.Emit的文章。
以下是链接:http://www.codeproject.com/KB/cs/dotnetattributes.aspx,您还需要查看本文底部的一些评论,因为可能的方法会被讨论。
在Java中,我曾经通过使用映射并实现我自己的Key-Value编码来解决此问题。
http://developer.apple.com/documentation/Cocoa/Conceptual/KeyValueCoding/KeyValueCoding.html
我很努力有没有成功System.ComponentModel.TypeDescriptor。这并不意味着它不能工作,但我希望看到代码。
在柜台部分,我想改变一些属性值。 我做了2个功能,为此目的正常工作。
// ************************************************************************
public static void SetObjectPropertyDescription(this Type typeOfObject, string propertyName, string description)
{
PropertyDescriptor pd = TypeDescriptor.GetProperties(typeOfObject)[propertyName];
var att = pd.Attributes[typeof(DescriptionAttribute)] as DescriptionAttribute;
if (att != null)
{
var fieldDescription = att.GetType().GetField("description", BindingFlags.NonPublic | BindingFlags.Instance);
if (fieldDescription != null)
{
fieldDescription.SetValue(att, description);
}
}
}
// ************************************************************************
public static void SetPropertyAttributReadOnly(this Type typeOfObject, string propertyName, bool isReadOnly)
{
PropertyDescriptor pd = TypeDescriptor.GetProperties(typeOfObject)[propertyName];
var att = pd.Attributes[typeof(ReadOnlyAttribute)] as ReadOnlyAttribute;
if (att != null)
{
var fieldDescription = att.GetType().GetField("isReadOnly", BindingFlags.NonPublic | BindingFlags.Instance);
if (fieldDescription != null)
{
fieldDescription.SetValue(att, isReadOnly);
}
}
}
- 1. 我可以在javascript中动态添加属性吗?
- 2. 你可以在Asp MVC 2.0中添加动态验证属性吗?
- 3. 动态添加属性到c#类
- 4. 在对象中动态添加属性
- 5. 在javascript中动态添加属性
- 6. 在Angular2中添加动态属性
- 7. 添加属性HREF动态
- 8. 在C#中,属性可以应用于静态类,方法或属性吗?
- 9. 你可以在Dart的函数中添加属性吗?
- 10. 我可以在select2的“text”属性中添加css语法吗?
- 11. 如何在C#中访问动态对象时添加属性
- 12. 如何在C#中为动态添加同名多个属性?
- 13. 我们可以在C#.NET的接口中添加变量和属性吗?
- 14. 添加属性动态地在javascript
- 15. Android:我可以在动态壁纸中添加图层吗?
- 16. 我可以将ivar(或属性)添加到objective-c中的现有类中吗?
- 17. AutoMapper可以映射静态属性吗?
- 18. 可以将CGImage添加到CAShapeLayer的内容属性中吗?
- 19. 在运行时动态添加C#属性
- 20. 添加动态属性模型
- 21. Angular2 - 动态添加HTML属性和类
- 22. 向HttpWebRequest动态添加属性
- 23. 从属性动态添加值
- 24. 动态添加元素属性
- 25. 如何添加XmlInclude属性动态
- 26. 添加动态属性和分类
- 27. Angular2 + MaterialDesignLite:添加HTML属性动态
- 28. 动态添加画布属性?
- 29. 的ActionScript - 动态添加属性雪碧
- 30. 动态添加属性到ExpandoObject
TypeDescriptor.AddAttributes(Object,Attribute [])将类级属性添加到目标组件实例。 – 2008-11-10 12:25:46