是否可以在.NET 4中创建一个类:
例如,这个C#类不会为我编译:
public class MyClass
{
public object Item { get; set; }
public object this[string index] { get { return null; } set { } }
}
Run Code Online (Sandbox Code Playgroud)
编译器给出错误CS0102:
"MyClass"类型已包含"Item"的定义
虽然我只是明确定义Item
一次.
我正在尝试将WPF ResourceDictionary添加到刚刚创建的C#项目中.该项目最初不是WPF项目,但现在我需要在其中包含一些WPF资源.
当我右键单击项目并选择"添加"时,ResourceDictionary不是一个选项.即使我打开模态对话框并导航到ResourceDictionary类型应该在的位置(与其他WPF类型一起),它也不存在.
此外,当我手动将具有ResourceDictionary语法的XAML文件添加到项目时,我无法使用WPF Application.Load(uri)语法以编程方式加载它,所以我觉得VS2010阻止我添加文件是有原因的.
如何让我的项目"能够"添加ResourceDictionary而无需从头开始重新创建整个项目作为WPF项目并从头开始重新添加每个文件?
另外,什么定义了可以添加到项目中的文件类型,以便将来可以避免类似的问题?希望它像我需要添加到AssemblyInfo.cs文件中的一行一样简单.
我有以下XAML代码:
<Window x:Class="RichText_Wrapping.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1">
<Grid>
<RichTextBox Height="100" Margin="2" Name="richTextBox1">
<FlowDocument>
<Paragraph>
This is a RichTextBox - if you don't specify a width, the text appears in a single column
</Paragraph>
</FlowDocument>
</RichTextBox>
</Grid>
Run Code Online (Sandbox Code Playgroud)
...如果在XAML中创建此窗口,您可以看到,当您没有为窗口指定宽度时,它会将文本包装在一个列中,一次一个字母.有什么我想念的吗?如果它是控制中已知的缺陷,是否有任何解决方法?
如果我在AppDomain中获得类型列表,这些类型是否有固有的排序?
List<Type> myTypes = new List<Type>();
foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies())
myTypes.AddRange(a.GetTypes());
Run Code Online (Sandbox Code Playgroud)
这似乎产生了一个按命名空间中的类型分组的列表,但我看不到命名空间组本身的模式(或每个命名空间组中的类型).
有没有办法可以忽略Json.NET [JsonIgnore]
在我无权修改/扩展的类上的属性?
public sealed class CannotModify
{
public int Keep { get; set; }
// I want to ignore this attribute (and acknowledge the property)
[JsonIgnore]
public int Ignore { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我需要序列化/反序列化此类中的所有属性.我已经尝试了继承Json.NET的DefaultContractResolver
类并重写看起来像是相关的方法:
public class JsonIgnoreAttributeIgnorerContractResolver : DefaultContractResolver
{
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
JsonProperty property = base.CreateProperty(member, memberSerialization);
// Serialize all the properties
property.ShouldSerialize = _ => true;
return property;
}
}
Run Code Online (Sandbox Code Playgroud)
但原始类的属性似乎总是赢:
public static void Serialize()
{
string serialized = …
Run Code Online (Sandbox Code Playgroud) 我正在尝试构建一个框架,允许人们通过实现接口来扩展我们的核心功能.下面是这个界面的一个愚蠢的例子.
public interface MyInterface
{
IData GetData(string p1, char p2, double p3);
}
Run Code Online (Sandbox Code Playgroud)
最近,我们决定修改这个界面(我知道我不应该破坏依赖代码,但事实是我们还没有任何第三方实现这个界面,所以我们有机会进行"重做"正确实现此接口).
我们需要在此界面中再添加2个参数,以使我们的软件正常工作.我们想到的两种方法就是将它们添加到签名中,如下所示:
public interface MyInterface
{
IData GetData(string p1, char p2, double p3, bool p4, DateTime p5);
}
Run Code Online (Sandbox Code Playgroud)
或者通过创建这样的参数对象
public class MyParameters
{
public bool p4 { get; set; }
public DateTime p5 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
并将它们添加到方法的末尾,如下所示:
public interface MyInterface
{
IData GetData(string p1, char p2, double p3, MyParameters p4);
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找某种指导,以哪种方式是"最"正确的方法.我可以在两个类别中看到利弊,但我不希望我的偏见让我走错了路.
我的一些主要担忧是:
我甚至不知道在线询问什么问题来获得这个问题的指导.我有一种感觉,答案是"它取决于"(关于如何将相关的p1-p5与GetData()函数的目的相关联),但有人可以指出我应该要求的一系列问题来帮助我评估一种解决方案是否优于另一种?
相关: 帖子1 …
我有ac#应用程序,我主要关注的是推出运行我的软件的客户端的自动更新.这些更新可以是从new/patched dll到新资源文件的任何内容.
我知道我可以创建一个ClickOnce应用程序以获得部分方式,但它不允许我想要的太多控制(例如,我希望能够轻松地"捆绑"第三方组件与我的软件或能够让用户决定他们想要更新哪些组件.
我看到像NotePad ++这样的程序有一个专用的更新程序,但是我希望我可以从别人那里捎带而不是从头开始滚动我自己的更新程序.
我有什么选择?
我正在研究允许用户通过实现一组接口来扩展系统的软件.
为了测试我们正在做的事情的可行性,我的公司通过在用户完全相同的方式中实现这些类中的所有业务逻辑来" 吃掉自己的狗食 ".
我们有一些实用程序类/方法将所有内容绑定在一起并使用可扩展类中定义的逻辑.
我想缓存用户定义函数的结果.我应该在哪里这样做?
是班级本身吗?这似乎可能会导致很多代码重复.
它是使用这些类的实用程序/引擎吗?如果是这样,不知情的用户可以直接调用类函数,而不是获得任何缓存优势.
public interface ILetter { string[] GetAnimalsThatStartWithMe(); }
public class A : ILetter { public string[] GetAnimalsThatStartWithMe()
{
return new [] { "Aardvark", "Ant" };
}
}
public class B : ILetter { public string[] GetAnimalsThatStartWithMe()
{
return new [] { "Baboon", "Banshee" };
}
}
/* ...Left to user to define... */
public class Z : ILetter { public string[] GetAnimalsThatStartWithMe()
{
return new [] { "Zebra" };
}
}
public …
Run Code Online (Sandbox Code Playgroud) 这样做是不好的形式,因为它不保留堆栈跟踪:
try { /*... some code that can throw an exception ...*/ }
catch (Exception e)
{
throw e; // ...Use "throw;" by itself instead
}
Run Code Online (Sandbox Code Playgroud)
但是,如果在非UI线程上捕获到异常,我想将其重新提升回UI并处理它,以便用户获取如下消息:
try { /*... some code that can throw an exception ...*/ }
catch (Exception e)
{
Dispatcher.Invoke((Action)(() => { throw; }));
}
Run Code Online (Sandbox Code Playgroud)
但是,我不能在这里单独使用throw关键字,因为C#lexer(正确)认为throw语句不在catch中.我不得不这样做:
try { /*... some code that can throw an exception ...*/ }
catch (Exception e)
{
Dispatcher.Invoke((Action)(() => { throw e; }));
}
Run Code Online (Sandbox Code Playgroud)
并重新抛出异常,这会丢失其堆栈跟踪.
是否有任何(简单)方法来解决这个问题(我总是可以在异常准备切换线程时打包堆栈跟踪,但这看起来很糟糕)?
注意:我看到了 …
是否可以保留项目文件的逻辑布局?
如果我有2个嵌入式资源,如下所示
当我调用Assembly.GetManifestResourceNames()时,它们中的两个被命名为:
但是,这让我无法真正了解它们在我的项目中的逻辑顺序.据我所知,他们都可以在同一个目录中.
我担心这可能是不可能的,因为如果我这样命名文件,我的应用程序甚至不会编译:
我希望能够区分