我的搜索一直只出现解释如何使用属性并将其应用于类的指南。我想了解如何创建自己的属性类及其工作原理。
属性类是如何实例化的?它们是在实例化它们所应用的类时实例化的吗?是否为每个实例化了它所应用的类实例化了一个?例如。如果我将 SerializableAttribute 类应用于 MyData 类,并实例化 5 个 MyData 实例,是否会在幕后创建 SerializbleAttribute 类的 5 个实例?还是只有一个实例在所有这些实例之间共享?
属性类实例如何访问它们关联的类? SerializableAttribute 类如何访问它所应用的类以便它可以序列化它的数据?它是否具有某种 SerializableAttribute.ThisIsTheInstanceIAmAppliedTo 属性? :) 或者它是否以相反的方向工作,每当我序列化某些东西时,我将 MyClass 实例传递给的序列化函数将反射性地遍历属性并找到 SerialiableAttribute 实例?
最佳答案
我以前没有在日常工作中使用属性,但我已经阅读过它们。 我也做了一些测试,以支持我在这里说的话。如果我在任何地方错了 - 请随时告诉我 :)
据我所知,属性不作为常规类。当您创建一个应用它们的对象时,它们不会被实例化,而不是一个静态实例,而不是每个对象实例 1 个。 他们也不访问他们所应用的类..
相反,它们的行为类似于类的属性(特性?:P)。不像 .NET 类 properties,更像是“玻璃的一个属性是透明度”类型的属性。您可以通过反射检查将哪些属性应用于类,然后对其进行相应的操作。它们本质上是附加到类定义的元数据,而不是该类型的对象。
您可以尝试获取类、方法、属性等的属性列表。当您获取这些属性的列表时——这就是它们将被实例化的地方。然后您可以对这些属性中的数据进行操作。
例如在 Linq 表中,属性具有定义它们引用的表/列的属性。但是这些类不使用这些属性。相反,当 DataContext 将 linq 表达式树转换为 SQL 代码时,它会检查这些对象的属性。
现在来看一些真实的例子.. 我已经在 LinqPad 中运行了这些,所以不用担心奇怪的 Dump() 方法。我已将其替换为 Console.WriteLine 以使不了解它的人更容易理解代码:)
void Main()
{
Console.WriteLine("before class constructor");
var test = new TestClass();
Console.WriteLine("after class constructor");
var attrs = Attribute.GetCustomAttributes(test.GetType()).Dump();
foreach(var attr in attrs)
if (attr is TestClassAttribute)
Console.WriteLine(attr.ToString());
}
public class TestClassAttribute : Attribute
{
public TestClassAttribute()
{
DefaultDescription = "hello";
Console.WriteLine("I am here. I'm the attribute constructor!");
}
public String CustomDescription {get;set;}
public String DefaultDescription{get;set;}
public override String ToString()
{
return String.Format("Custom: {0}; Default: {1}", CustomDescription, DefaultDescription);
}
}
[Serializable]
[TestClass(CustomDescription="custm")]
public class TestClass
{
public int Foo {get;set;}
}
这个方法的控制台结果是:
before class constructor
after class constructor
I am here. I'm the attribute constructor!
Custom: custm; Default: hello
Attribute.GetCustomAttributes(test.GetType()) 返回此数组:
(该表显示了所有条目的所有可用列。所以不,Serializable 属性没有这些属性:))
还有问题吗?欢迎提问!
更新: 我看到你问了一个问题:为什么要使用它们? 作为示例,我将向您介绍 XML-RPC.NET 库。 您创建 XML-RPC 服务类,使用表示 xml-rpc 方法的方法。现在最主要的是:在 XmlRpc 中,方法名称可以有一些特殊字符,比如点。因此,您可以拥有一个 flexlabs.ProcessTask() xml rpc 方法。
您可以按如下方式定义此类:
[XmlRpcMethod("flexlabs.ProcessTask")]
public int ProcessTask_MyCustomName_BecauseILikeIt();
这允许我以我喜欢的方式命名方法,同时仍然使用必须的公共(public)名称。
关于c# - 属性类如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2676603/
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳
我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request
在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo
我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog
对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs