我在.NET/Reflection中遇到了一个奇怪的行为,无法找到任何解决方案/解释:
class A
{
public virtual string TestString { get; set; }
}
class B : A
{
public override string TestString
{
get { return "x"; }
}
}
Run Code Online (Sandbox Code Playgroud)
由于属性只是函数对(get_PropName(),set_PropName()),只覆盖"get"部分应该保留"set"部分,就像它在基类中一样.这就是如果您尝试将类B实例化并赋值TestString,它会使用A类的实现.
但是如果我在反射中查看B类的实例化对象会发生什么呢?
PropertyInfo propInfo = b.GetType().GetProperty("TestString");
propInfo.CanRead ---> true
propInfo.CanWrite ---> false(!)
Run Code Online (Sandbox Code Playgroud)
如果我尝试从反射中调用setter:
propInfo.SetValue("test", b, null);
Run Code Online (Sandbox Code Playgroud)
我甚至会收到ArgumentException以下消息:
找不到属性集方法.
这是预期的吗?因为我似乎没有找到一个方法的组合,BindingFlags该GetProperty()方法返回属性与反射中的工作get/set对.
编辑:如果我使用BindingFlags.DeclaredOnlyon ,我会期望这种行为,GetProperties()但默认(BindingFlags.Default)将继承的成员考虑在内,而且TestString的setter显然是继承的!
我必须承认我不是SAP R/3编程方面的专家,因此这更像是一个基本问题.
有没有办法在SAP系统上获取可访问的RFC模块和/或表的列表?在互联网上的许多例子中,我发现了一个似乎可以在每个SAP系统上使用的RFC模块("SD_RFC_CUSTOMER_GET"),我想知道是否还有更多这些标准RFC模块可以使用.我可以轻松地在SAP系统中查询所有可用的SAP查询,但我找不到使用RFC模块或表格执行此操作的方法.在Google上搜索了几个小时之后,我甚至找不到这些RFC模块的列表...所以我错过了一些东西或者这是不可能的?
在此先感谢您的帮助.
具有以下属性的 ListView(或 ListBox):
<ListView SelectionMode="Single">
<sys:String>James</sys:String>
<sys:String>Claude</sys:String>
<sys:String>Justing</sys:String>
<sys:String>James</sys:String>
</ListView>
Run Code Online (Sandbox Code Playgroud)
如果我单击“James”,将导致同时选择两个项目,即使我选择了 SelectionMode="Single"。当我使用带有字符串属性的帮助器类在 ListView 中显示时,甚至会有相同的行为。看起来 ListView 正在评估项目并选择那些 Equal() 而不是 ReferenceEqual() 的项目。有没有办法改变这种行为,以便 ListView 单独处理每个项目?
我有一个相当简单的 WCF 自托管服务,它使用 WSHttpBinding 只是拒绝工作。如果服务和客户端在同一台机器上运行,则没有问题,但是一旦我将服务移动到窗口服务器 2008,客户端就会尝试与
例外
[System.ServiceModel.Security.SecurityNegotiationException] {"SOAP 安全协商与目标 'http://hvw-svr-01/SIT' 的目标 'http://hvw-svr-01/SIT' 失败。有关更多信息,请参阅内部异常细节。”}
内部异常
[System.ComponentModel.Win32Exception] {"安全支持提供程序接口 (SSPI) 协商失败。服务器可能未在身份为“host/hvw-svr-01”的帐户中运行。如果服务器在服务帐户中运行(例如网络服务),将帐户的 ServicePrincipalName 指定为服务器的 EndpointAddress 中的标识。如果服务器在用户帐户中运行,请指定帐户的 UserPrincipalName 作为服务器的 EndpointAddress 中的标识。"}
由于它是一个自托管服务,我想我需要指定 UserPrincipalName,但无论我对该属性进行什么尝试,它都不起作用。
也尝试使用不同的用户帐户,包括内置的管理员。如果我尝试 BasicHttpBinding 而不是 WSHttpBinding 一切都按预期工作。我在谷歌(和stackoverflow)上阅读了大量关于该问题的文章,但我仍然无法弄清楚问题是什么以及如何指定该身份。
编辑:服务 App.Config
<system.serviceModel>
<services>
<service name="SIT.Communication.Gate">
<host>
<baseAddresses>
<add baseAddress="http://localhost:2323/SIT" />
</baseAddresses>
</host>
<endpoint address="" binding="wsHttpBinding" contract="SIT.Core.IGate">
<identity>
<dns value="localhost"/>
<userPrincipalName value="XZDom\DGrain"/>
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="True" />
</behavior> …Run Code Online (Sandbox Code Playgroud) 场景:我即将实现一个缓存功能,我想在其中缓存我从Web服务收到的序列化对象树.序列化对象以byte []形式出现,我基本上只想创建一个我想要存储的第二个字节[],以防我想要恢复原始数据而无需再次查询Web服务.
问题:如果我使用一个简单的循环将源字节[]复制到目标字节[]中,例如:
for (int i = 0; i < source.Length - 1; i++)
target[i] = source[i];
Run Code Online (Sandbox Code Playgroud)
那么BinaryFormatter无法反序列化新的byte [].例外说:
二进制流'0'不包含有效的BinaryHeader.可能的原因是序列化和反序列化之间的无效流或对象版本更改.
但是如果我使用Buffer.BlockCopy()或Array.CopyTo()复制数组,则BinaryFormatter对复制的byte []进行反序列化没有问题.
所以我的问题是,是否有人知道为什么以及如何在循环中复制该数组与使用这些函数不同?在第一种方法中,该字节[]究竟缺少了什么?
.net ×5
c# ×5
asp.net ×2
vb.net ×2
abap ×1
bapi ×1
overriding ×1
properties ×1
reflection ×1
sap ×1
silverlight ×1
wcf ×1
wpf ×1