我有一个 WebApi,它有一些接受 XMLDocument 值的操作方法。在这些函数中,我将该 XML 转换为 AnonymousObject ,然后,我按照我的逻辑。
现在,我得到了带有空属性的 XML,我需要做一个检查,它可以检查那个匿名对象中的所有属性,如果它们是 null 或空的,我在那里做了一些事情但它没有用,虽然,我传递了具有空属性的 XML。
<Students>
<Student ID="" Name="" />
<Student ID="" Name="" />
</Students>
这是我得到的 XML 输入的一个例子,还有一些其他的形式,所以,我写了一个函数来检查在将 XML 反序列化为匿名对象后属性是否为空,如下所示:
//This handles the conversion from XML to the anonymous object
XDocument doc;
using (var sr = new StringReader(request.InnerXml))
{
doc = XDocument.Load(sr);
}
var clientList = doc.Descendants()
.Where(d => string.Equals(d.Name.LocalName, "Student", StringComparison.OrdinalIgnoreCase))
.Select(
d =>
new
{
studentId = d.Attributes().SingleOrDefault(a =>
string.Equals(a.Name.LocalName, "ID", StringComparison.OrdinalIgnoreCase))
?.Value,
studentName = d.Attributes().SingleOrDefault(a =>
string.Equals(a.Name.LocalName, "Name", StringComparison.OrdinalIgnoreCase))
?.Value
}).ToList();
然后我写了一个函数来验证匿名对象的属性,所有属性都应该有一个值,但是如果我传递了上面的 XML,它将返回 FALSE 就好像没有属性具有空值一样:
public static bool IsAnyNullOrEmpty(object objectToBeChecked)
{
try
{
foreach (PropertyInfo pi in objectToBeChecked.GetType().GetProperties())
{
if (pi.PropertyType == typeof(string))
{
string value = (string)pi.GetValue(objectToBeChecked);
if (string.IsNullOrEmpty(value))
{
return true;
}
}
}
return false;
//return objectToBeChecked.GetType().GetProperties()
// .Where(pi => pi.GetValue(objectToBeChecked) is string)
// .Select(pi => (string) pi.GetValue(objectToBeChecked))
// .Any(string.IsNullOrEmpty);
}
catch (Exception ex)
{
return true;
}
}
有什么建议吗?
调试时我注意到:
<>f__AnonymousType3`1 Name = "<>f__AnonymousType3`1" FullName = "<>f__AnonymousType3`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]" 最佳答案
我强烈建议为此使用命名类而不是匿名类。显然,您对 xml 中的实例公开的属性有一些深入的了解,因此隐藏这些知识是没有用的。
想象一下,有一天您不仅需要字符串属性,还需要数字。然后,您必须重新发明大部分逻辑,不仅是验证,还有对象的实际工作。
我猜你想做的不仅仅是验证你的对象。您肯定想对它们做一些事情。为此,您需要知道它们公开了哪些成员。在您当前的实现中,它们只是对象,不会向其客户公开太多内容。所以为了做任何事情你需要这样的东西:
var a = ((theType) myInstance).StudentName;
但是您已经丢失了有关 theType 实际是什么的所有信息,因此您对该对象所能做的就是调用 ToString、Equals和一些其他派生自 object 的成员。
在您的特殊情况下,您已经知道 xml 中的实例具有 StudentName- 和 studentId- 属性。那么,您为什么要扔掉它并假装自己不知道呢?
截至MSDN :
To pass an anonymous type, or a collection that contains anonymous types, as an argument to a method, you can declare the parameter as type object. However, doing this defeats the purpose of strong typing. If you must store query results or pass them outside the method boundary, consider using an ordinary named struct or class instead of an anonymous type.
关于c# - 如何检查匿名对象属性是否为空 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47813780/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/