我有一个需要在STA公寓状态下运行的功能.我不想检查它是否作为STA运行,如果没有生成一个在STA中运行的新线程.
如何检查当前线程运行的公寓状态?
我有以下情况:
public interface IPerson { .. }
public class Person : IPerson { .. }
public class User : Person { .. }
Run Code Online (Sandbox Code Playgroud)
现在; 如果我有一个"用户"对象 - 我如何检查这是否使用反射实现IPerson?更确切地说,我有一个可能具有属性SomeUser的对象,它应该是某种类型,实现接口"IPerson".在我的情况下,我实际上有一个用户,但这是我想通过反思检查.我无法弄清楚如何检查属性类型,因为它是一个"用户",但我想检查它是否实现了IPerson ...:
var control = _container.Resolve(objType); // objType is User here
var prop = viewType.GetProperty("SomeUser");
if ((prop != null) && (prop.PropertyType is IPerson))
{ .. }
Run Code Online (Sandbox Code Playgroud)
(请注意,这是我实际情况的简化,但重点应该相同......)
根据这种模式, VS2010 Premium和Ultimate有一个用于检查代码覆盖率的工具 - 以及一些其他测试工具.这也支持nUnit,还是只支持MS测试?
我有一个ObservableCollection,我想将IList的内容设置为这个.现在我可以创建一个新的集合实例..:
public ObservableCollection<Bar> obs = new ObservableCollection<Bar>();
public void Foo(IList<Bar> list)
{
obs = new ObservableCollection<Bar>(list);
}
Run Code Online (Sandbox Code Playgroud)
但是,我怎样才能真正获取IList的内容并将其添加到我现有的ObservableCollection中?我是否必须遍历所有元素,还是有更好的方法?
public void Foo(IList<Bar> list)
{
foreach (var elm in list)
obs.Add(elm);
}
Run Code Online (Sandbox Code Playgroud) 在下面的代码示例中,我有一个Async Calculator类.这是注入一个ICalc,它将是一个同步计算器.我使用依赖注入和模拟ICalc,因为这类似于我的真实场景,尽管我认为模拟与问题无关.AsyncCalc有一个函数,它将异步调用另一个函数 - 将回调作为参数.当异步函数调用完成时,将使用结果触发回调.
现在我想测试我的异步函数 - 检查是否使用期望参数触发了回调.这段代码似乎有效.但是,我觉得它可能随时都会爆炸 - 我担心的是在函数结束和测试终止之前完成回调的竞争条件 - 因为这将在一个单独的线程中运行.
我现在的问题是,如果我在正确的轨道单元测试异步功能,或者是否有人可以帮助我走上正确的轨道..?更好的是,如果我能确保立即触发回调 - 最好是在同一个线程上我猜?可以/应该这样做吗?
public interface ICalc
{
int AddNumbers(int a, int b);
}
public class AsyncCalc
{
private readonly ICalc _calc;
public delegate void ResultProcessor(int result);
public delegate int AddNumbersAsyncCaller(int a, int b);
public AsyncCalc(ICalc calc)
{
_calc = calc;
}
public void AddNumbers(int a, int b, ResultProcessor resultProcessor)
{
var caller = new AddNumbersAsyncCaller(_calc.AddNumbers);
caller.BeginInvoke(a, b, new AsyncCallback(AddNumbersCallbackMethod), resultProcessor);
}
public void AddNumbersCallbackMethod(IAsyncResult ar)
{
var result = …
Run Code Online (Sandbox Code Playgroud) 如何在WCF中为抽象类定义DataContract?
我有一个类"人",我使用WCF成功通信.现在我添加一个从Person引用的新类"Foo".一切都还不错.但是当我将Foo抽象化并定义一个子类时,它就失败了.它在服务器端使用CommunicationException失败,但这并没有真正告诉我太多.
我的简化课程用于测试:
[DataContract]
public class Person
{
public Person()
{
SomeFoo = new Bar { Id = 7, BaseText = "base", SubText = "sub" };
}
[DataMember]
public int Id { get; set; }
[DataMember]
public Foo SomeFoo { get; set; }
}
[DataContract]
public abstract class Foo
{
[DataMember]
public int Id { get; set; }
[DataMember]
public string BaseText { get; set; }
}
[DataContract]
public class Bar : Foo
{
[DataMember]
public string SubText { get; …
Run Code Online (Sandbox Code Playgroud) 我有像Miguel Castro建议的WCF服务结构.这意味着我已手动设置所有内容,并使用ServiceHost对象托管我的服务的控制台应用程序.
我想保持我的服务类很薄,他们目前只是调用行为类.我现在的问题是单元测试服务类.我想向类中注入一些东西作为构造函数参数,这样我就可以模拟它并编写适当的隔离单元测试.ServiceHost类似乎不接受参数,所以我的问题是如何将数据注入服务类 - 或者我不能?
我目前正在使用WCF实现一个Silverlight应用程序,用于客户端和服务器之间的通信.我听说使用WCF我们必然会在客户端使用一些Microsoft技术,并且不能轻易地将其替换为"任何东西" - 至少使用WPF的默认SOAP实现.
所以我的问题是:
假设我有以下简单类:
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
}
public class PersonHolder
{
public Person CurrentPerson { get; set; }
public int ActiveId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在我有类PersonHolder的实例为栅格DataContext
,和在网格我有一个StackPanel
被绑定到CurrentPerson
的PersonHolder
-表示它的数据:
<Grid>
<StackPanel x:Name="PersonPanel" DataContext="{Binding CurrentPerson}">
<TextBlock Text="{Binding Id}" />
<TextBlock Text="{Binding Name}" />
</StackPanel>
</Grid>
Run Code Online (Sandbox Code Playgroud)
所以-这个问题:我如何给StackPanel
在绿色背景CurrentPerson
有一个Id
匹配ActiveId
的的PersonHolder
(是的,非常有用的,但是这仅仅是一个非常简单的例子..).我的想法是,这是一个使用触发器的东西,但我可以在触发条件值中使用绑定吗?如果是这样我可以这样做:
<Grid x:Name="Foo">
<StackPanel x:Name="PersonPanel" …
Run Code Online (Sandbox Code Playgroud) 升级到ReSharper5后,它为我提供了更多有关代码改进的有用提示.我现在到处看到的一个是用LINQ查询替换foreach语句的提示.举个例子:
private Ninja FindNinjaById(int ninjaId)
{
foreach (var ninja in Ninjas)
{
if (ninja.Id == ninjaId)
return ninja;
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
建议使用LINQ替换为以下内容:
private Ninja FindNinjaById(int ninjaId)
{
return Ninjas.FirstOrDefault(ninja => ninja.Id == ninjaId);
}
Run Code Online (Sandbox Code Playgroud)
这看起来很好,我确信在替换这个foreach时性能没有问题.但这是我应该做的一般事情吗?或者我可能遇到所有这些LINQ查询的性能问题?
.net ×7
c# ×5
wcf ×3
service ×2
unit-testing ×2
asynchronous ×1
data-binding ×1
datacontract ×1
datatrigger ×1
linq ×1
list ×1
mstest ×1
nunit ×1
performance ×1
reflection ×1
resharper ×1
sta ×1
wpf ×1