小编Chr*_*air的帖子

使用属性覆盖属性

我正试图找到一种方法来改变属性的序列化行为.

可以说我有这样的情况:

[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)

.net c# serialization attributes properties

10
推荐指数
2
解决办法
9980
查看次数

获取没有反射或已知类型的装配参考

在我当前的框架设计中,我仔细阅读所有类型的特定程序集,并根据找到的类型进行工作.它搜索的程序集由应用程序引导程序/初始化程序确定.程序集是编译的,因此可以通过以下方式强引用它们: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)

c# .net-4.0 xamarin.android silverlight-5.0

8
推荐指数
1
解决办法
2217
查看次数

从第三方依赖项解析/使用多个程序集版本

在我的项目中,我的依赖层次结构存在问题.我在我的代码中使用了一个库(WriteableBitmapExtensions),我还有另一个第三方库,它也使用了WriteableBitmapExtensions.只有其他库与特定的旧版本密切相关,我的代码需要其最新版本的功能.

这是对依赖关系的描述: 依赖树

有类似的问题和解决方案,但他们通过配置文件在运行时使用程序集绑定解决它,但我不认为这与Silverlight应用程序兼容.

在同一解决方案中引用2个不同版本的log4net

在同一文件夹中使用同一程序集的不同版本

第三方库引用不同版本的log4net.dll

如何处理多个版本的依赖项?

那么有没有办法在Silverlight上下文中解决这些不同版本的程序集依赖项?如果没有,我认为我的选择是:

1)我很可能会说服第三方库的供应商更新以使用最新版本的WriteableBitmapExtensions,但我更愿意不依赖它们使其保持最新状态.特别是因为WriteableBitmapExtensions项目仍在更新,我们经常利用他们的新功能.

2)由于WriteableBitmapExtensions是开源的,我想我可以将其源代码重新编译为新的程序集"MyWriteableBitmapExtensions"并在我的源代码中使用它.但是如果两个第三方库引用不同版本的WriteableBitmapExtensions,我将再次遇到这个问题.

我怀疑我将使用选项2,但我想知道在提交/重构之前是否有更好的方法(如其他问题中的运行时程序集绑定).谢谢!

.net silverlight assemblies multiple-versions

5
推荐指数
1
解决办法
1231
查看次数

Mono 2.6.4使用什么版本的C#?

也许(希望)我错过了一些显而易见的东西,但我无法从Mono网站上看到什么版本的C#用于任何特定版本的Mono,而作为C#newbie我不知道如何直接找到我自己.

我的具体问题是:Mono 2.6.4使用的是什么版本的C#?(我对该版本感兴趣的原因是它似乎是当前Unity 3D版本使用的Mono变体的基本版本.)

c# mono unity-game-engine

2
推荐指数
1
解决办法
1622
查看次数

有效转换特定值的方法

所以我要说我有一个字符串数组:

string[] values = new[] { "1", "2", "3", "1.5", "56.5", "8" };
Run Code Online (Sandbox Code Playgroud)

让我们说我必须遍历这些值并执行以下操作:

  1. 将它舍入到最接近的偶数(如果它只是一个双数)

  2. 四舍五入后删除数字的小数部分.

  3. 如果数字为负数,请删除该符号.

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)

.net c# parsing casting rounding

1
推荐指数
1
解决办法
125
查看次数