我正试图找到一种方法来改变属性的序列化行为.
可以说我有这样的情况:
[Serializable]
public class Record
{
public DateTime LastUpdated {get; set; }
// other useful properties ...
}
public class EmployeeRecord : Record
{
public string EmployeeName {get; set; }
// other useful properties ...
}
Run Code Online (Sandbox Code Playgroud)
现在我想序列化EmployeeRecord.我不希望序列化Record类中的LastUpdated属性.(我确实希望在序列化Record时序列化LastUpdated).
首先,我尝试使用new关键字隐藏LastUpdated属性,然后添加XmlIgnore属性:
public class EmployeeRecord : Record
{
public string EmployeeName {get; set; }
[XmlIgnore]
public new DateTime LastUpdated {get; set; }
// other useful properties ...
}
Run Code Online (Sandbox Code Playgroud)
但那没用.然后我尝试将基础LastUpdated虚拟化并覆盖它,保留属性:
[Serializable]
public class Record
{
public virtual DateTime LastUpdated {get; set; } …Run Code Online (Sandbox Code Playgroud) 在我当前的框架设计中,我仔细阅读所有类型的特定程序集,并根据找到的类型进行工作.它搜索的程序集由应用程序引导程序/初始化程序确定.程序集是编译的,因此可以通过以下方式强引用它们:typeof(SomeTypeInTheAssembly).Assembly.这很好,因为引导程序代码具有对程序集中类型的强引用,并且没有任何关于完全限定名称作为内联字符串的笨拙,如果程序集限定名称发生更改,则需要手动保持最新.但我不喜欢在程序集中引用一些完全不相关的类型,并依赖于那种类型.(如果它移动到另一个程序集怎么办?如果我们弃用/删除类型怎么办?更改其命名空间?)在代码中,它看起来有点奇怪:
FrameworkAssemblyReader.Read(typeof(SomeAssemblyNamespace.SubNamespace.GraphingCalculator).Assembly);
Run Code Online (Sandbox Code Playgroud)
现在在我的引导代码中,我有一个直接依赖(虽然是一个非常简单的依赖),GraphingCalculator它与自举阶段无关(并且作为GraphingCalculator,它当然与获取程序集引用无关).为了避免这种情况,在我打算以这种方式使用的每个程序集中,我在它们的根中添加了一个类:
namespace SomeAssemblyNamespace
{
public static class AssemblyReference
{
public static System.Reflection.Assembly Get
{
get
{
return typeof(AssemblyReference).Assembly;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这不是太糟糕,因为我的引导代码看起来像:
FrameworkAssemblyReader.Read(SomeAssembly.AssemblyReference.Get);
Run Code Online (Sandbox Code Playgroud)
但是现在,我有大约十几个这样的程序集AssemblyReference复制/粘贴,我只希望它继续增长,因为应用程序是在框架的顶部构建的.所以我的问题是,是否有一种很好的方法可以避免AssemblyReference类重复并仍然以编程方式将程序集引用传递给基本框架,但是避免指向目标程序集中某些任意/不相关类型的模糊性?我的谷歌搜索似乎告诉我,没有API或语言功能让我强烈指向一个程序集(比如typeof类),但我希望有人能提出一个比我更好的解决方案来避免类/代码复制.另外值得注意的是,代码有时是针对Silverlight编译的,所以我知道这可能会限制一些API /技术.谢谢!
编辑:只是添加另一个猴子扳手,根据"浣熊"的答案,我应该提到我并不总是加载相同的组件.例如,我可能有一个"CarBuilding"程序集,适用于某些应用程序但不适用于所有应用程序.这取决于bootstrappers告诉我他们希望使用哪些(以及开发人员正在使用的任何自定义的)
EDITx2:回答Jon Skeet的问题:客户(或我们内部)将创建他们希望支持其应用程序的任何项目/ DLL.反过来,这些项目将引用内部基础框架.他们的项目可能包含资源(3D文件,图像,文本,本地化等)和插件式类(它们实现我们在应用程序生命周期内根据需要发现和实例化/执行的脚本).此外,我们的系统提供可选模块(DLL),其中包含客户(或我们)在制作特定应用程序时可以利用的可重用插件/内容.所以你可能会看到一个项目结构,如:
Solution
->MyAppBootstrapper_Android
->MyAppGUI_Android
->MyAppFramework
->MyAppResources
->MyAppAdditionalResources_Android
->MyAppBootstrapper_Silverlight
->MyAppGUI_Silverlight
->MyAppFramework
->MyAppResources
->MyAppAdditionalResources_Silverlight
->BaseFrameworkGraphingModule
Run Code Online (Sandbox Code Playgroud)
引导程序项目连接依赖项,并提供应该提供给基础框架以进行发现的项目/ dll(程序集).请注意,在这种情况下,"MyApp"在Android和Silverlight构建中共享其自己的迷你框架和共享资源,但两者都有彼此独立的引用.Silverlight利用了它,BaseFrameworkGraphingModule并且它们拥有自己特定于平台的资源.
所以在项目的bootstrappers看起来像(虽然简化):
namespace MyAppBootstrapper_Android
{
public class Bootstrapper
{
public void Setup()
{
FrameworkAssemblyReader.Read(MyAppGUI_Android.AssemblyReference.Get);
FrameworkAssemblyReader.Read(MyAppFramework.AssemblyReference.Get);
FrameworkAssemblyReader.Read(MyAppResources.AssemblyReference.Get);
FrameworkAssemblyReader.Read(MyAppAdditionalResources_Android.AssemblyReference.Get);
}
} …Run Code Online (Sandbox Code Playgroud) 在我的项目中,我的依赖层次结构存在问题.我在我的代码中使用了一个库(WriteableBitmapExtensions),我还有另一个第三方库,它也使用了WriteableBitmapExtensions.只有其他库与特定的旧版本密切相关,我的代码需要其最新版本的功能.
这是对依赖关系的描述: 
有类似的问题和解决方案,但他们通过配置文件在运行时使用程序集绑定解决它,但我不认为这与Silverlight应用程序兼容.
那么有没有办法在Silverlight上下文中解决这些不同版本的程序集依赖项?如果没有,我认为我的选择是:
1)我很可能会说服第三方库的供应商更新以使用最新版本的WriteableBitmapExtensions,但我更愿意不依赖它们使其保持最新状态.特别是因为WriteableBitmapExtensions项目仍在更新,我们经常利用他们的新功能.
2)由于WriteableBitmapExtensions是开源的,我想我可以将其源代码重新编译为新的程序集"MyWriteableBitmapExtensions"并在我的源代码中使用它.但是如果两个第三方库引用不同版本的WriteableBitmapExtensions,我将再次遇到这个问题.
我怀疑我将使用选项2,但我想知道在提交/重构之前是否有更好的方法(如其他问题中的运行时程序集绑定).谢谢!
也许(希望)我错过了一些显而易见的东西,但我无法从Mono网站上看到什么版本的C#用于任何特定版本的Mono,而作为C#newbie我不知道如何直接找到我自己.
我的具体问题是:Mono 2.6.4使用的是什么版本的C#?(我对该版本感兴趣的原因是它似乎是当前Unity 3D版本使用的Mono变体的基本版本.)
所以我要说我有一个字符串数组:
string[] values = new[] { "1", "2", "3", "1.5", "56.5", "8" };
Run Code Online (Sandbox Code Playgroud)
让我们说我必须遍历这些值并执行以下操作:
将它舍入到最接近的偶数(如果它只是一个双数)
四舍五入后删除数字的小数部分.
如果数字为负数,请删除该符号.
string[] values = new[] { "1", "2", "3", "1.5", "56.5", "8" };
for (int i = 0; i < values.Length; i++)
{
file[i].Value = ((Int32)Math.Abs(Math.Round(Double.Parse(values[i]), MidpointRounding.ToEven))).ToString();
}
Run Code Online (Sandbox Code Playgroud)
这与基本相同:
string[] values = new[] { "1", "2", "3", "1.5", "56.5", "8" };
for (int i = 0; i < values.Length; i++)
{
String strValue = values[j];
Double dblValue = Double.Parse(strValue);
Double dblRoundedValue = Double.Parse(dblValue);
Int32 …Run Code Online (Sandbox Code Playgroud) c# ×4
.net ×3
.net-4.0 ×1
assemblies ×1
attributes ×1
casting ×1
mono ×1
parsing ×1
properties ×1
rounding ×1
silverlight ×1