gpt4 book ai didi

c# - 动态对象 - 运行时报告字段不存在但可以在调试器中看到它?

转载 作者:太空狗 更新时间:2023-10-29 21:51:27 25 4
gpt4 key购买 nike

编辑:重新启动 visual studio 解决了这个问题,没有更改代码。


我有一个使用动态类型和 expando 对象的 ConfigSection 处理程序。测试失败报告 'object' 不包含 'SportName' 的定义。我试图在控制台中复制,将 ConfigSection 处理程序排除在等式之外,但看起来等效代码工作正常。我很难过。

请参阅下面的测试、ConfigurationSectionHandler 和配置 xml

public class SportSection : IConfigurationSectionHandler
{
public object Create(object parent, object configContext, XmlNode section)
{
var doc = XDocument.Parse(section.OuterXml);
var root = (XElement)doc.FirstNode;

try
{
var sportList = root.Element("sportList").Elements("sport").Select(ToSport);

dynamic config = new ExpandoObject();
config.SportList = sportList;

return config;
}
catch (Exception ex)
{
throw new ConfigurationErrorsException("Invalid SportSection configuration", ex);
}
}

private static dynamic ToSport(XElement sportElement)
{
try
{
var getAttrib = new Func<XElement, string, string>((x, atr) => x.Attribute(atr).Value);
var getDictionary =
new Func<IEnumerable<XElement>, IDictionary<string, string>>(elems => elems.ToDictionary(x => x.Attribute("name").Value, y => y.Attribute("value").Value));

return new
{
SportName = sportElement.Attribute("name").Value,
EventProperties = getDictionary(sportElement.Element("eventProperties").Elements("property")),
CompetitionProperties = getDictionary(sportElement.Element("competitionProperties").Elements("property")),
MappedMarkets = sportElement.Element("mapping").Elements("market").Select(x => new MappedMarket() { Type = getAttrib(x, "type"), MappedType = getAttrib(x, "mappedType") })
};
}
catch (Exception ex)
{

throw ex;
}

}
}


[Test]
public void GoodConfig()
{
var document = new XmlDocument();
document.LoadXml(Resources.ValidSportSectionConfig);

var config = new SportSection().Create(null, null, document) as dynamic;

IEnumerable<dynamic> sportList = config.SportList;

Assert.AreEqual(1, sportList.Count());
//Microsoft.CSharp.RuntimeBinder.RuntimeBinderException : 'object' does not contain a definition for 'SportName'
Assert.AreEqual("Baseball", sportList.Select(x => (string) x.SportName).First());

var eventProperties = sportList.First(x => x.SportName == "Baseball").EventProperties as IDictionary<string, string>;

Assert.AreEqual(2, eventProperties.Count);
Assert.AreEqual("BSB", eventProperties["SportId"]);
Assert.AreEqual("THA", eventProperties["CompetitorReferenceId"]);

var compProps = sportList.First(x => x.SportName == "Baseball").CompetitionProperties as IDictionary<string, string>;
Assert.AreEqual(2, compProps.Count);
Assert.AreEqual("BSB", compProps["SportId"]);
Assert.AreEqual("CUP", compProps["CompetitionOrgMethodId"]);

var mappedMarkets = (sportList.First(x => x.SportName == "Baseball").MappedMarkets as IEnumerable<MappedMarket>).ToList();
Assert.AreEqual(2, mappedMarkets.Count());
Assert.AreEqual("match_winner" , mappedMarkets[0].Type);
Assert.AreEqual("BSBAO", mappedMarkets[0].MappedType);
Assert.AreEqual("handicap", mappedMarkets[0].Type);
Assert.AreEqual("BSBAQ", mappedMarkets[0].MappedType);
}

<sportSettings>
<sportList>
<sport name="Baseball">
<eventProperties>
<property name="SportId" value="BSB"></property>
<property name="CompetitorReferenceId" value="THA"></property>
</eventProperties>
<competitionProperties>
<property name="SportId" value="BSB" />
<property name="CompetitionOrgMethodId" value="CUP" />
</competitionProperties>
<mapping>
<market type="match_winner" mappedType="BSBAO" />
<market type="handicap" mappedType="BSBAQ" />
</mapping>
</sport>
</sportList>
</sportSettings>

更新 - 堆栈跟踪:

at CallSite.Target(Closure , CallSite , Object )
at System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0)
at SS.Integration.EVenue.WindowsService.UnitTests.Configuration.SportSectionTests.<GoodConfig>b__11(Object x) in C:\_Git\SS.Integration.EVenue\SS.Integration.EVenue.WindowsService.UnitTests\Configuration\SportSectionTests.cs:line 35

最佳答案

ToSport 返回匿名类型而不是 ExpandoObject。将匿名类型转换为动态类型时必须小心,因为这些类型具有 internal 的访问修饰符。因此,如果您跨越程序集边界,运行时将看不到任何可访问的属性。尝试:

 private static dynamic ToSport(XElement sportElement)
{
try
{
var getAttrib = new Func<XElement, string, string>((x, atr) => x.Attribute(atr).Value);
var getDictionary =
new Func<IEnumerable<XElement>, IDictionary<string, string>>(elems => elems.ToDictionary(x => x.Attribute("name").Value, y => y.Attribute("value").Value));


dynamic n = new ExpandoObject();
n.SportName = sportElement.Attribute("name").Value;
n.EventProperties = getDictionary(sportElement.Element("eventProperties").Elements("property"));
n.CompetitionProperties = getDictionary(sportElement.Element("competitionProperties").Elements("property"));
n.MappedMarkets = sportElement.Element("mapping").Elements("market").Select(x => new MappedMarket() { Type = getAttrib(x, "type"), MappedType = getAttrib(x, "mappedType") });

return n;
}
catch (Exception ex)
{

throw ex;
}

}

关于c# - 动态对象 - 运行时报告字段不存在但可以在调试器中看到它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10316344/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com