我最近尝试在编写新的NUnit测试时使用Assert.Equals()方法.在执行时,这种方法抛出一个AssertionException说明,
Assert.Equals should not be used for Assertions. 乍一看这有点莫名其妙.这里发生了什么?
我处于这样一种情况,我想要实例化一个将在运行时确定的类型的对象.我还需要对该类型执行显式转换.
像这样的东西:
static void castTest(myEnum val)
{
//Call a native function that returns a pointer to a structure
IntPtr = someNativeFunction(..params..);
//determine the type of the structure based on the enum value
Type structType = getTypeFromEnum(val);
structType myStruct = (structType)Marshal.PtrToStructure(IntPtr, structType);
}
Run Code Online (Sandbox Code Playgroud)
这显然不是有效的代码,但我希望它传达了我想要做的事情的本质.我实际工作的方法必须在~35种不同的类型上执行编组操作.我有几个其他方法需要使用相同的类型集来做类似的事情.所以,我想从这些方法中分离出类型决定逻辑,这样我只需要编写一次,这样方法就可以保持清晰和可读.
我必须承认自己是设计界的新手.有谁能建议一个很好的方法解决这个问题?我怀疑可能有一个我不知道的合适的设计模式.
根据我的理解,SerializableAttribute不提供编译时检查,因为它都是在运行时完成的.如果是这种情况,那么为什么要将类标记为可序列化?
串行器无法尝试序列化对象然后失败?这不就是它现在做的吗?当标记某些内容时,它会尝试并失败.如果你必须将事物标记为不可序列化而不是可序列化,那不是更好吗?那样你就不会有库不将事物标记为可序列化的问题?
我有一个我使用序列化/反序列化的类XmlSerializer.该类包含一个DateTime字段.
序列化时,该DateTime字段由包含GMT偏移的字符串表示,例如2010-05-05T09:13:45-05:00.反序列化时,这些时间将转换为执行反序列化的机器的本地时间.
由于不值得解释的原因,我想阻止这种时区转换的发生.序列化发生在野外,其中存在此类的多个版本.反序列化发生在我控制的服务器上.因此,似乎在反序列化期间最好处理这个问题.
除了IXmlSerializable"手动" 执行和执行所有反序列化之外,我怎样才能实现这一点?
我是C#反思的绝对新手.我想使用反射来访问类中的所有私有字段,包括那些继承的字段.
我成功访问了所有私有字段,不包括那些继承的字段,以及所有公共和受保护的继承字段.但是,我无法访问私有的继承字段.以下示例说明:
class A
{
private string a;
public string c;
protected string d;
}
class B : A
{
private string b;
}
class test
{
public static void Main(string[] Args)
{
B b = new B();
Type t;
t = b.GetType();
FieldInfo[] fields = t.GetFields(BindingFlags.Public | BindingFlags.NonPublic
| BindingFlags.Instance);
foreach(FieldInfo fi in fields){
Console.WriteLine(fi.Name);
}
Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud)
这无法找到Ba字段
是否有可能实现这一目标?显而易见的解决方案是将私有的继承字段转换为受保护的字段.然而,目前这是我无法控制的.
我正在研究一些生成Excel电子表格服务器端的代码,然后将其下载到用户.我正在使用ExcelPackage生成文件.
这一代工作得很好.我可以使用Excel 2007打开生成的文件,没有任何问题.但是,我无法下载文件Response.TransmitFile().
现在,我有以下代码:
//Generate the file using ExcelPackage
string fileName = generateExcelFile(dataList, "MyReportData");
Response.AddHeader("content-disposition", "attachment;filename=FileName.xls");
Response.ContentType = "application/vnd.xls"
Response.Charset = "";
Response.TransmitFile(fileName);
Run Code Online (Sandbox Code Playgroud)
当Excel 2007打开如上所下载的文件时,它会提供"文件格式与扩展名不匹配"警告.单击警告后,Excel将显示该文件的原始xml内容.
如果我更改文件扩展名,就像这样
Response.AddHeader("content-disposition", "attachment;filename=FileName.xlsx");
Run Code Online (Sandbox Code Playgroud)
Excel 2007提供"Excel在文件中找到不可读的内容"错误,然后是一个对话框,提供在Web上查找转换器.如果我点击"否",该对话框上的Excel 是能够加载数据.
我还尝试了不同的MIME类型,例如application/vnd.ms-excel和application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.xls和.xlsx的文件扩展名.所有组合都导致上述两种行为之一.
在此方案中使用的文件扩展名和MIME类型的正确组合是什么?除了不正确的MIME类型或扩展名之外,还有什么可能导致此失败?
仅供参考,这是Visual Studio的内置开发Web服务器.我还没有尝试使用IIS.
**编辑:下面有几个选项可行.请根据您对此事的看法进行投票/评论.
我正在使用以下基本结构清理和添加ac#方法的功能:
public void processStuff()
{
Status returnStatus = Status.Success;
try
{
bool step1succeeded = performStep1();
if (!step1succeeded)
return Status.Error;
bool step2suceeded = performStep2();
if (!step2suceeded)
return Status.Warning;
//.. More steps, some of which could change returnStatus..//
bool step3succeeded = performStep3();
if (!step3succeeded)
return Status.Error;
}
catch (Exception ex)
{
log(ex);
returnStatus = Status.Error;
}
finally
{
//some necessary cleanup
}
return returnStatus;
}
Run Code Online (Sandbox Code Playgroud)
有许多步骤,并且在大多数情况下,步骤x必须成功才能进入步骤x + 1.现在,我需要添加一些总是在方法结束时运行的功能,但这取决于返回值.我正在寻找关于如何干净地重构这个以达到预期效果的建议.显而易见的选择是将依赖于返回值的功能放在调用代码中,但我无法修改调用者.
一种选择:
public void processStuff()
{
Status returnStatus = Status.Success;
try
{
bool step1succeeded …Run Code Online (Sandbox Code Playgroud) 我碰到了一些奇怪的东西.DateTime当我将它们保存到datetime列时,SQL Server似乎不恰当地舍入了一些值.我怀疑我错过了什么,但我无法发现它.我正在使用.NET 4.0对SQL Server 2008运行此测试.以下内容应说明问题:
我在SQL Server中创建了一个名为Timestamps的表.它有两列:
id - bigint,Identity,PK
timestamp - datetime
我还创建了一个简单的测试,它执行以下操作:
Timestampspublic static void RoundTest()
{
DateTime preTruncation = DateTime.UtcNow;
DateTime truncated = preTruncation.TruncateToMilliseconds();
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["test"].ConnectionString))
{
conn.Open();
SqlCommand cmd = new SqlCommand(@"INSERT INTO Timestamps(timestamp)
VALUES(@savedTime);
SELECT SCOPE_IDENTITY() AS id");
cmd.Parameters.Add(new SqlParameter("savedTime", truncated));
cmd.Connection = conn;
var id = cmd.ExecuteScalar();
SqlCommand get = new SqlCommand(@"SELECT timestamp FROM Timestamps
WHERE id = @id");
get.Parameters.Add(new SqlParameter("id", id)); …Run Code Online (Sandbox Code Playgroud) 请考虑以下代码:
namespace ConsoleApplication
{
using NamespaceOne;
using NamespaceTwo;
class Program
{
static void Main(string[] args)
{
// Compilation error. MyEnum is an ambiguous reference
MethodNamespace.MethodClass.Frobble(MyEnum.foo);
}
}
}
namespace MethodNamespace
{
public static class MethodClass
{
public static void Frobble(NamespaceOne.MyEnum val)
{
System.Console.WriteLine("Frobbled a " + val.ToString());
}
}
}
namespace NamespaceOne
{
public enum MyEnum
{
foo, bar, bat, baz
}
}
namespace NamespaceTwo
{
public enum MyEnum
{
foo, bar, bat, baz
}
}
Run Code Online (Sandbox Code Playgroud)
编译器抱怨MyEnum在调用Frobble()时是一个模糊的引用.由于调用的方法没有歧义,因此可能希望编译器根据方法签名解析类型引用.为什么不呢?
请注意,我并不是说编译器应该这样做.我相信它有一个非常好的理由.我只想知道这是什么原因.
我正在研究一个多线程的C#Windows应用程序,它经常调用本机dll.阻塞调用有时会持续很长时间.
在某些情况下,我想在主线程的某些工作线程上取消这些阻塞调用我正在使用的本机API为此提供了一个函数:
HRESULT CancelBlockingCall(DWORD ThreadID)
Run Code Online (Sandbox Code Playgroud)
尽管CancelBlockingCall()的文档并不十分清楚,但我相信我需要为操作系统级别的线程传递ThreadID.基于我从CancelBlockingCall()得到的返回码,我意识到Thread.ManagedThreadID不是我需要的.我在msdn上找到了以下内容(参见注释):
操作系统ThreadId与托管线程没有固定的关系,因为非托管主机可以控制托管和非托管线程之间的关系.具体而言,复杂的主机可以使用CLR Hosting API针对同一操作系统线程调度许多托管线程,或者在不同操作系统线程之间移动托管线程.
这是否意味着我无法为托管线程正确调用CancelBlockingCall()?是否无法确定托管线程当前正在执行的OS级线程的ThreadId?
c# ×8
.net ×4
datetime ×2
asp.net ×1
enums ×1
mime-types ×1
namespaces ×1
nunit ×1
refactoring ×1
reflection ×1
rounding ×1
runtime ×1
sql-server ×1
timezone ×1
windows ×1