- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个具有多个属性的对象,如下所示:
public int num1 { get; set; }
public int num2 { get; set; }
public string str1 { get; set; }
public string str2 { get; set; }
这些属性位于一个动态生成的类中,因此它将删除它们上的所有 CustomAttributes。
我尝试添加
[Submit]
MyClass myObject
但它并没有传播到我的对象属性上
有没有办法在 C# 中动态地做到这一点?
最佳答案
我在理解您的问题时遇到了一些困难,但让我尝试澄清一下。
I have an object with multiple attributes ... it will erase all CustomAttributes
在 C# 中,格式为 <access> <type> <name> { get; set; }
的类成员被称为“属性”而不是“属性”。另一方面,“属性”是注释的 C# 实现,例如您所指的自定义属性。
也就是说,我目前的理解是您有一个自动生成的具有多个属性的类。您希望这些属性中的每一个都有自己的自定义属性,但如果您编辑类,它们将在下次生成时被删除,并且您无法让类生成器包含自定义属性。
了解更多类背景可能会有所帮助。例如,它是如何生成的?如果它是 Entity Framework 类,则以下 SO 问题可能会提供一些见解: Add data annotations to a class generated by entity framework .一般来说,是(或者你能不能)生成的类 partial
?如果是这样,那么您仍然可以按照上述问题的答案中的方法,viz. 创建您自己的部分类实现,以提供属性的自定义特性。
例如,如果您生成的类看起来(或可以看起来)像这样:
/// <auto-generated />
public partial class MyClass
{
public int Num1 { get; set; }
public int Num2 { get; set; }
public string Str1 { get; set; }
public string Str2 { get; set; }
}
您可以使用自定义注释编写分部类的其他部分,如下所示:
/// human generated
public partial class MyClass
{
[Submit]
public int Num1 { get; set; }
[Submit]
public int Num2 { get; set; }
[Submit]
public string Str1 { get; set; }
[Submit]
public string Str2 { get; set; }
}
同样,在不了解您的情况的情况下,我不确定这是否为您提供了所需的信息,但我希望它至少能为您提供一个起点。
编辑
如果该类不是部分类,您可以考虑使用其包装属性使用自定义属性的类来包装生成的类。例如,
/// human generated
public class MyClassWrapper
{
private readonly MyClass wrapped;
public MyClassWrapper(MyClass wrapped)
{
this.wrapped = wrapped;
}
[Submit]
public int Num1 { get => this.wrapped.Num1; set => this.wrapped.Num1 = value; }
[Submit]
public int Num2 { get => this.wrapped.Num2; set => this.wrapped.Num2 = value; }
[Submit]
public string Str1 { get => this.wrapped.Str1; set => this.wrapped.Str1 = value; }
[Submit]
public string Str2 { get => this.wrapped.Str2; set => this.wrapped.Str2 = value; }
}
编辑2
如果您宁愿有一个更动态的解决方案,以一些设计和运行时的复杂性为代价,您可以考虑这个 SO 问题:How to add property-level Attribute to the TypeDescriptor at runtime? .它似乎解决了类似的问题——
Really, it's for MS's Application Settings that generates code, so you can't extend it in any way property-wise.
我不会在这里完全重复 Gman 的解释,但基本上这种方法包括
MyClass
) 或 myObject
类型的实例TypeDescriptor.GetProvider(MyClass
/myObject).GetTypeDescriptor(MyClass
/myObject)
获取类型或对象的基线 ICustomTypeDescriptor
PropertyOverridingTypeDescriptor
有了这个基线描述符MyClass
/myObject
“属性”定义为 TypeDescriptor.GetProperties(MyClass
/myObject)
.使用 TypeDescriptor.CreateProperty
根据当前属性的定义创建新的属性定义,添加自定义属性 EditorAttribute
(或在您的情况下为 SubmitAttribute
),并使用 PropertyOverridingTypeDescriptor
在 3. 中构造以使用新的属性定义。TypeDescriptorOverridingProvider
与 PropertyOverridingTypeDescriptor
在 3 中构建。MyClass
/myObject
与 TypeDescriptor.AddProvider
关于c# - 如何动态地将 CustomAttribute 添加到所有对象属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57165406/
你能比较一下属性吗 我想禁用文本框“txtName”。有两种方式 使用javascript,txtName.disabled = true 使用 ASP.NET, 哪种方法更好,为什么? 最佳答案 我
Count 属性 返回一个集合或 Dictionary 对象包含的项目数。只读。 object.Count object 可以是“应用于”列表中列出的任何集合或对
CompareMode 属性 设置并返回在 Dictionary 对象中比较字符串关键字的比较模式。 object.CompareMode[ = compare] 参数
Column 属性 只读属性,返回 TextStream 文件中当前字符位置的列号。 object.Column object 通常是 TextStream 对象的名称。
AvailableSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。 object.AvailableSpace object 应为 Drive 
Attributes 属性 设置或返回文件或文件夹的属性。可读写或只读(与属性有关)。 object.Attributes [= newattributes] 参数 object
AtEndOfStream 属性 如果文件指针位于 TextStream 文件末,则返回 True;否则如果不为只读则返回 False。 object.A
AtEndOfLine 属性 TextStream 文件中,如果文件指针指向行末标记,就返回 True;否则如果不是只读则返回 False。 object.AtEn
RootFolder 属性 返回一个 Folder 对象,表示指定驱动器的根文件夹。只读。 object.RootFolder object 应为 Dr
Path 属性 返回指定文件、文件夹或驱动器的路径。 object.Path object 应为 File、Folder 或 Drive 对象的名称。 说明 对于驱动器,路径不包含根目录。
ParentFolder 属性 返回指定文件或文件夹的父文件夹。只读。 object.ParentFolder object 应为 File 或 Folder 对象的名称。 说明 以下代码
Name 属性 设置或返回指定的文件或文件夹的名称。可读写。 object.Name [= newname] 参数 object 必选项。应为 File 或&
Line 属性 只读属性,返回 TextStream 文件中的当前行号。 object.Line object 通常是 TextStream 对象的名称。 说明 文件刚
Key 属性 在 Dictionary 对象中设置 key。 object.Key(key) = newkey 参数 object 必选项。通常是 Dictionary 
Item 属性 设置或返回 Dictionary 对象中指定的 key 对应的 item,或返回集合中基于指定的 key 的&
IsRootFolder 属性 如果指定的文件夹是根文件夹,返回 True;否则返回 False。 object.IsRootFolder object 应为&n
IsReady 属性 如果指定的驱动器就绪,返回 True;否则返回 False。 object.IsReady object 应为 Drive&nbs
FreeSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。只读。 object.FreeSpace object 应为 Drive 对象的名称。
FileSystem 属性 返回指定的驱动器使用的文件系统的类型。 object.FileSystem object 应为 Drive 对象的名称。 说明 可
Files 属性 返回由指定文件夹中所有 File 对象(包括隐藏文件和系统文件)组成的 Files 集合。 object.Files object&n
我是一名优秀的程序员,十分优秀!