在C#中是否可以编写将向代码添加预处理程序指令的MSIL代码,例如#warning
,如果满足某个条件?或许这可以通过反思完成,我不知道.
我正在尝试编写一个自定义属性,如果错误地应用于类的方法或属性,将生成编译器警告.使用现有Obsolete
属性将无法工作,因为只使用我的自定义属性会导致警告,我不希望这样.我希望自定义属性构造函数检查条件,如果该条件为true,则导致编译警告.
更新: 在回顾了我的问题之后,我认为我所要求的是不可能的,因为我正在混合编译时和运行时约束.我想我最终将使用一个后期构建任务来检查刚刚构建的DLL,如果条件为真,它会发出错误消息.
我试图理解接口,以便我可以在我的程序中实现它们,但我无法想象我应该如何使用它们.还给我一些例如在C#中使用它们的多重继承
我有一个问题,想要一个属性有一个内部getter和一个受保护的setter,如本问题所述,我想我通过执行以下操作解决了这个问题:
public class Accessor : AccessorBase
{
private Connection _connection;
protected void setConnection(Connection value)
{
_connection = value;
}
internal Connection GetConnection()
{
return _connection;
}
...
}
Run Code Online (Sandbox Code Playgroud)
但是,我现在收到此错误:
可访问性不一致:参数类型"连接"比方法"setConnection(连接)"更难访问
这是因为我有internal class Connection
.我宁愿不做Connection
公开课,同时Accessor
需要公开,所以如何在保持内部getter和受保护的setter的同时解决这个错误呢?
我使用电子邮件地址作为用户名,并允许用户更改他们的电子邮件...这显然也会更改他们的登录信息.是否有任何理由允许这种灵活性成为一个问题?用户ID跟踪用户.
谢谢
我想捕获发送到标准输出的输出和MSTest单元测试中的标准错误,以便我可以验证它.我在明确运行a之前捕获了输出Process
,但有没有办法处理[我猜] MSTest进程本身?例如:
[TestMethod]
public void OutputTest()
{
MySnazzyMethod("input", 1, 'c');
string stdOutFromMySnazzyMethod = /* ??? */;
Assert.AreEqual("expected output", stdOutFromMySnazzyMethod);
}
Run Code Online (Sandbox Code Playgroud) 我有以下代码:
private static LogLevel? _logLevel = null;
public static LogLevel LogLevel
{
get
{
if (!_logLevel.HasValue)
{
_logLevel = readLogLevelFromFile();
}
return _logLevel.Value;
}
}
private static LogLevel readLogLevelFromFile() { ... }
Run Code Online (Sandbox Code Playgroud)
我在return
关于可能性的声明中得到了ReSharper警告System.InvalidOperationException
,它建议我检查_logLevel
它是否是null
第一个.然而,readLogLevelFromFile
回报LogLevel
,没有LogLevel?
,所以没有办法的return
时候语句可以达成_logLevel
的null
.这只是ReSharper的疏忽,还是我错过了什么?
在jUnit测试中,我想根据列从数据库中获取一些行name
.然后我想测试我得到的行有我期望的名字.我有以下内容:
Set<MyClass> typesToGet = MyClassFactory.createInstances("furniture",
"audio equipment");
Collection<String> namesToGet = Collections2.transform(typesToGet,
new NameFunction<MyClass, String>());
List<MyClass> typesGotten = _svc.getAllByName(typesToGet);
assertThat(typesGotten.size(), is(typesToGet.size()));
Collection<String> namesGotten = Collections2.transform(typesGotten,
new NameFunction<ItemType, String>());
assertEquals(namesToGet, namesGotten); // fails here
Run Code Online (Sandbox Code Playgroud)
我目前失败了:
java.lang.AssertionError:expected:com.google.common.collect.Collections2 $ TransformedCollection <[音频设备,家具]>但是:com.google.common.collect.Collections2 $ TransformedCollection <[音频设备,家具]>
那么什么是最干净,最简洁的测试方法,我从数据库中找回了哪些name
列与我说的我想要的名字相匹配?我可以for
循环迭代并检查一个列表中的每个名称是否存在于另一个列表中,但我希望更简洁.类似下面的伪代码会很好:
List<MyClass> typesGotten = ...;
["furniture", "audio equipment"].equals(typesGotten.map(type => type.getName()))
Run Code Online (Sandbox Code Playgroud) 我有一个标签,内容如下:
<%@ tag body-content="empty"%>
<%@ attribute name="timestamp" required="true" type="java.sql.Timestamp"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<jsp:useBean id="dateValue" class="java.util.Date" />
<c:if test="${not empty timestamp}">
<jsp:setProperty name="dateValue" property="time" value="${timestamp}" />
<span title="${timestamp}"> <fmt:formatDate value="${dateValue}"
pattern="MM/dd/yyyy HH:mm" /> </span>
</c:if>
Run Code Online (Sandbox Code Playgroud)
但是我得到以下错误:
错误500:com.ibm.ws.jsp.JspCoreException:java.lang.IllegalArgumentException:无法将类型为java.sql.Timestamp的5/1/12 10:36 AM转换为long
我试图按照这个答案将时间戳转换为JSTL中的日期,所以我不会在servlet中更改任何内容.如何使用JSTL 将a转换java.sql.Timestamp
为日期以便formatDate
可以使用它?
我正在尝试使用C#中的RSA加密和解密数据.我有以下MSTest单元测试:
const string rawPassword = "mypass";
// Encrypt
string publicKey, privateKey;
string encryptedPassword = RSAUtils.Encrypt(rawPassword, out publicKey, out privateKey);
Assert.AreNotEqual(rawPassword, encryptedPassword,
"Raw password and encrypted password should not be equal");
// Decrypt
string decryptedPassword = RSAUtils.Decrypt(encryptedPassword, privateKey);
Assert.AreEqual(rawPassword, decryptedPassword,
"Did not get expected decrypted password");
Run Code Online (Sandbox Code Playgroud)
它在解密过程中失败,但有时只会失败.似乎每当我设置断点并逐步完成测试时,它就会通过.这让我觉得也许有些事情没有及时完成解密才能成功发生,而且我在调试过程中放慢了步伐,给了它足够的时间来完成.当它失败时,它似乎失败的行是decryptedBytes = rsa.Decrypt(bytesToDecrypt, false);
在以下方法中:
public static string Decrypt(string textToDecrypt, string privateKeyXml)
{
if (string.IsNullOrEmpty(textToDecrypt))
{
throw new ArgumentException(
"Cannot decrypt null or blank string"
);
}
if (string.IsNullOrEmpty(privateKeyXml))
{
throw new ArgumentException("Invalid private …
Run Code Online (Sandbox Code Playgroud) 我正在尝试选择所有节点1)来自具有特定属性的节点并且2)自己具有特定属性.所以,如果我有以下XML:
<node id="1"><child attr="valueOfInterest"/></node>
<node id="2"><child attr="boringValue"/></node>
...
<node id="3"><child attr="valueOfInterest"/></node>
<node id="4"><child attr="boringValue"/></node>
<node id="5"><child attr="boringValue"/></node>
<node id="6"><child attr="boringValue"/></node>
...
Run Code Online (Sandbox Code Playgroud)
我的XSLT遍历每个node
标记.在每一个node
,我希望它选择所有以前node
因为最近发生的小号node
是有child
其attr
是valueOfInterest
.所以,如果我在节点#2,我想要一个空节点集.如果我在节点#6,我想选择节点#4和5.我目前有以下XSLT:
<xsl:variable name="prev_vals"
select="preceding-sibling::node/child[@attr = $someValueICareAbout]/@attr"/>
Run Code Online (Sandbox Code Playgroud)
因此,此XSLT获取attr
特定值的所有先前值.如何只得到这些前attr
值是在node
经过最近而来小号node
,其child
有一个特定的attr
值(即,"valueOfInterest")?标签id
上的属性node
不保证会增加,因此我们无法与之进行比较.
编辑: 我认为这些可能有用:
<xsl:variable name="prev_children_of_interest"
select="preceding-sibling::node/child[@attr != $someValueICareAbout]"/>
<xsl:variable name="mru_child_of_interest"
select="$prev_children_of_interest[count($prev_children_of_interest)]"/>
Run Code Online (Sandbox Code Playgroud)
所以以前的所有child
标签都有attr=valueOfInterest
,然后是最近使用的(最接近当前节点)child
标签,它具有我正在寻找的属性.从mru_child_of_interest
我们可以找到最近使用的parent
标记,但是我们如何查找该标记之后的节点?