我有一个带有静态工厂方法的类.我想调用工厂来检索类的实例,然后通过c#object initializer语法进行额外的初始化:
MyClass instance = MyClass.FactoryCreate()
{
someProperty = someValue;
}
Run Code Online (Sandbox Code Playgroud)
VS
MyClass instance = MyClass.FactoryCreate();
instance.someProperty = someValue;
Run Code Online (Sandbox Code Playgroud) 我有一些代码使用反射来从对象中提取属性值.在某些情况下,属性可能会抛出异常,因为它们具有空引用等.
object result;
try
{
result = propertyInfo.GetValue(target, null);
}
catch (TargetInvocationException ex)
{
result = ex.InnerException.Message;
}
catch (Exception ex)
{
result = ex.Message;
}
Run Code Online (Sandbox Code Playgroud)
最终代码正常工作,但是当我在调试器下运行时:
当属性抛出异常时,IDE将进入调试器,就好像异常未被捕获一样.如果我刚刚运行,程序就会流出,异常作为TargetInvocationException出现,并在InnerException属性中有真正的异常.
我怎么能阻止这种情况发生?
c# reflection exception propertyinfo targetinvocationexception
我有一个应用程序动态加载c#源文件并作为插件运行它们.当我在调试模式下运行主应用程序时,是否可以调试到动态程序集?显然设置断点是有问题的,因为源不是原始项目的一部分,但我是否应该介入或打破代码的异常?
有没有办法让编码器生成这个或什么的PDB?
这是我用于动态compliation的代码.
CSharpCodeProvider codeProvider = new CSharpCodeProvider(new Dictionary<string, string>() { { "CompilerVersion", "v3.5" } });
//codeProvider.
ICodeCompiler icc = codeProvider.CreateCompiler();
CompilerParameters parameters = new CompilerParameters();
parameters.GenerateExecutable = false;
parameters.GenerateInMemory = true;
parameters.CompilerOptions = string.Format("/lib:\"{0}\"", Application.StartupPath);
parameters.ReferencedAssemblies.Add("System.dll");
parameters.ReferencedAssemblies.Add("System.Core.dll");
CompilerResults results = icc.CompileAssemblyFromSource(parameters, Source);
DLL.CreateInstance(t.FullName, false, BindingFlags.Default, null, new object[] { engine }, null, null);
Run Code Online (Sandbox Code Playgroud) 我有一个带有几种形式的wpf应用程序.在设计时它们很小,并且它们没有设置为自动尺寸.然而,在运行时它们是巨大的,即使它们没有任何内容使它们变大.
为什么会这样?
这是其中一种形式
<Window x:Class="SuperPluginPicker"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:tree="clr-namespace:Aga.Controls.Tree;assembly=Aga.Controls"
mc:Ignorable="d"
d:DesignHeight="296" d:DesignWidth="634" Title="Plugin Selector" WindowStartupLocation="CenterOwner">
<Grid>
<DockPanel LastChildFill="true">
<StackPanel DockPanel.Dock="Bottom" Height="30" Orientation="Horizontal">
<Button Content="Ok" Name="btnOk" Click="btnOk_Click"></Button>
<Button Content="Cancel" Name="btnCancel" Click="btnCancel_Click"></Button>
</StackPanel>
<StackPanel DockPanel.Dock="Right">
<Label Content="Selected Plugins"></Label>
<ListBox Name="lstSelectedPlugins" Width="200">
<ListBox.ItemTemplate>
<DataTemplate>
<Label Content="{Binding Name}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
<StackPanel DockPanel.Dock="Right" Width="100" VerticalAlignment="Center">
<Button Content="Add" Name ="btnAdd" Click="btnAdd_Click"></Button>
<Button Content="Remove" Name="btnRemove" Click="btnRemove_Click"></Button>
<Button Content="Remove All" Name="btnRemoveAll" Click="btnRemoveAll_Click"></Button>
</StackPanel>
<tree:TreeList x:Name="pluginTree">
<tree:TreeList.View>
<GridView x:Name="treeGrid">
<GridView.Columns>
<GridViewColumn Width="Auto" Header="Name">
<GridViewColumn.CellTemplate>
<DataTemplate> …
Run Code Online (Sandbox Code Playgroud) 我有一个WPF表单,我想在其上列出一个标准表单.每个表单元素都有一个标签,然后是一个控件.很标准的东西.
如果我使用包装面板,它可能导致标签和控件分开,但我希望它们保持在一起.是否有一些WPF相当于<nobr/>
?
网格工作,并允许列跨越等,但我真的很讨厌你在每个控件上指定列和行.这使得将内容重新排序或插入列表非常不方便.
有没有办法让网格使用更多HTML样式的列/行,其中项目是他们所在行的子项,以便我可以轻松地重新排序?
是否有其他控件可以让我轻松布局表单?
我在VS2010 SP1上创建了一个空白的MVC 3应用程序,并将应用程序设置为使用IIS Express.当我调试时,我得到错误500.0(0x80070585)
我能够使用VS dev服务器成功运行应用程序
我已将app目录设置为Everyone的完全权限,只是为了消除所有安全问题的可能性.我进一步验证了IIS express能够通过使用SysInternals ProcMon确认它来访问web.config.procmon中并没有显示IISExpress进程尝试从我的应用程序目录中的任何其他文件的读取.
我已经按照以下问题提出了建议,但它没有给我任何更好的信息.HTTP 500内部错误 - IIS网站
在Logs或TraceLogs目录中的IISExpress目录中没有生成日志,但是在Temp中创建了日志,但它不是很有用.
Successfully registered URL "http://localhost:62017/" for site "MvcApplication1" application "/"
Registration completed for site "MvcApplication1"
Request ended: http://localhost:62017/ with HTTP status 500.0
Request ended: http://localhost:62017/ with HTTP status 500.0
Request ended: http://localhost:62017/ with HTTP status 500.0
Run Code Online (Sandbox Code Playgroud)
我无法在事件查看器中找到任何消息
**更新:**禁用防火墙,无需更改通过命令行运行IISExpress,无需更改
在c#中将两个uint组合成ulong的最佳方法是什么,设置高/低uints.
我知道bitshifting可以做到这一点,但我不知道语法,或者可能有其他API来帮助像BitConverter,但我没有看到一个方法做我想要的.
我有一个实现INotifyPropertyChanged的自定义对象.我有这些对象的集合,其中集合基于BindingList我已经为集合创建了一个绑定源,并设置了bindingsource和datagridview的数据源.
一切都很好,除了我需要从后台线程更新自定义对象的属性.当我这样做时,我收到以下错误:
BindingSource不能是自己的数据源.不要将DataSource和DataMember属性设置为引用BindingSource的值
我发现以下帖子似乎有我的确切问题(和解决方案?)但我无法弄明白.
我在业务对象中创建并初始化了每个帖子的oper变量,然后将两个事件函数放入我的集合类中.这个编译正确,但运行时毫无例外地挂起.
我看过许多帖子说使用Invoke/Begin Invoke,但是我没有调用UI上的任何函数,只是更新业务对象,所以我不确定在哪里调用invoke.
一个限制:我希望业务对象不知道谁在显示它(因为有多个消费者)所以将GUI引用发送到业务对象,以便我以后能够使用这些引用调用invoke不是一个选项.
c# data-binding multithreading datagridview inotifypropertychanged
我有一个对象列表,每个对象都有一个bool ShouldRun()方法.
我正在迭代对象列表,并检查每个对象上的ShouldRun(),并在第一个上调用Run()返回true
foreach (child in Children)
{
if (child.ShouldRun())
{
child.Run();
break;
}
}
Run Code Online (Sandbox Code Playgroud)
我想并行执行此操作,因为评估shouldRun可能需要相当长的时间,并且让集合中的后续元素尽早开始评估是有利的.
但是,我无法想到一种满足这些条件的方法:
1只运行一个项目
2如果之前的项目为true,或者尚未完成评估,请不要运行以后的项目
3如果所有"早期"项目都返回false,并且中间项目返回true,则不要等待后面的项目完成评估,因为您知道它不能提前覆盖任何内容.
我想做一个并行的"where"linq查询来检索所有的项目,然后运行shouldRun()然后排序,但这会违反条件#3
想法?
背景资料:
该系统用于通用机器人AI系统.
一些较高优先级的任务可以由立即已知的传感器变量触发,例如:我摔倒,修复它!
其他任务可能是计算密集型的(从相机进行图像识别,并接近可见目标)
其他任务可能是数据库或远程驱动(从数据库中查找可能的目标位置列表,然后在那里导航以查看是否可以进入其中一个的可见范围)
一些任务本身具有子任务,这本质上是在一个任务的子集上递归地开始这个过程,并且孙子任务将通过链传递
我有一个递归问题,消费者在树的每个级别做一些工作,然后需要递归树并在下一级执行相同的工作.
我想使用ConcurrentBag/BlockingCollection等并行运行它.在这种情况下,队列的使用者也是队列的生产者!
我的问题是这样的:使用BlockingCollection,我可以编写非常简单的foreach逻辑来对项目进行队列化,并对新项目进行排队 - 当队列为空时,阻塞集合将正确阻塞,并等待其中一个新工作生成消费者.
但我如何知道所有消费者是否都在阻止?!
我知道CompleteAdding(),但这似乎没有服务,因为你实际完成的唯一时间是所有的生产者都完成生产并且队列是空的 - 因为它们都会阻塞,所以没有人"免费"设置CompleteAdding().有没有办法检测到这个?(也许是一个可以在阻挡时触发的事件,并在解锁时再次触发?)
我可以手动处理,不使用foreach,但手动有一段时间(!完整)循环,并使用TryTake,但后来我需要手动睡眠,这似乎是无效的(完全的原因是阻止集合vs只是首先是并发集合!)每次循环,如果TryTake为假,我可以设置一个空闲标志,然后有一个Master检查队列是否为空,并且所有线程都空闲,设置一个完整的标志,但同样,这似乎很糟糕.
直觉告诉我有一些方法可以使用Blocking Collection来做到这一点,但我无法达到目的.
无论如何,任何人都有一个良好的模式,当消费者是生产者,并能够检测何时释放所有块将是真棒
c# ×7
wpf ×2
.net ×1
bit-shift ×1
concurrency ×1
consumer ×1
data-binding ×1
datagridview ×1
debugging ×1
exception ×1
factory ×1
foreach ×1
forms ×1
grid ×1
iis-express ×1
initializer ×1
layout ×1
linq ×1
object ×1
producer ×1
propertyinfo ×1
reflection ×1
size ×1
uint ×1
ulong ×1
window ×1