小编Mar*_*tus的帖子

如何编写转换器类?如何有效地编写映射规则?

我有一个很大的A级,有很多成员,我有一个很大的B级,可以在拥有一个A对象时构建.具有B对象时可以构建A对象.我需要它们两个,因为A是一种ViewModel,它有验证,B是图形描述,可以很容易地绘制.

怎么做这个转换?

这是一个例子,来说明我想做的事情:

class A
{
    string s;
    string t;
    string u;
    string v;

    enum a;
    enum b;
    enum c;
    enum d;
    enum e;

    Dictionary<enum, string> dict;
}


class B
{
    string someString; // is essentially A.a + A.b + A.c + A.s with some rules.
    int someValue; // is essentially dict.TryGetValue(enum.Entry);
    string anotherString;
    // ... and lots of others
}
Run Code Online (Sandbox Code Playgroud)

当然,做一些映射很简单,并且构建一个B对象,通过反转构建A => B的规则来编写普通的B => A映射并不是很难.

所以问题是:

  • 是否有任何众所周知的模式来实现这一目标?
  • 是否有默认的C#方式来做这些事情?

写下类似的东西似乎不合适,最终会产生数百行代码.

我想到了某些部件的转换器类,比如SomeStringConverter,SomeValueConverter,......

  • 我如何抽象所需的A成员和规则来进行映射.
  • 如何编写这些规则以便以最简单的方式进行A => B和B => A.

编辑: 这里的模式是"最佳实践",而不是"GoF设计模式"

B类中的SomeString是某种"选择器",它选择绘图选项,它总是25个字符长,A类中的枚举选择那些字符,但在大多数情况下不是1对1. …

c# architecture mapping design-patterns converter

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

小数点后双精度

午休时我们开始讨论double价值类型的精确度.

我的同事认为,小数点后总是有15位.

在我看来,人们无法分辨,因为IEEE 754没有对此做出假设,它取决于第一个1在二进制表示中的位置.(即小数点前的数字大小也计算在内)

怎么能做出更合格的陈述?

c# double ieee-754

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

Jon Skeet Singleton和EventAggregator

为了简单的模块间通信,存在经典.NET事件,但现在有太多事件,并且存在通过模块相互调用的事件链.

就像Event_A触发Event_B时触发Event_C.

EventAggregator对于一个模块中的解耦通信非常方便,所以我尝试了一个小的"Jon Skeet Singleton IV" EventAggregator来打破这些event链.关于C#单身人士的Jon Skeet可以在这里找到

他告诉它是线程安全的,但他的例子只是暴露了一个Singleton资源.

这是我的代码

public static class GlobalEventAggregator
{
    private static readonly IEventAggregator EventAggregator = new EventAggregator();

    // tell C# compiler not to mark type as beforefieldinit
    static GlobalEventAggregator()
    {
    }

    public static void Subscribe(object instance)
    {
        EventAggregator.Subscribe(instance);
    }

    public static void Unsubscribe(object instance)
    {
        EventAggregator.Unsubscribe(instance);
    }

    public static void Publish(object message)
    {
        EventAggregator.Publish(message);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我可以GlobalEventAggregator在每个模块中使用它来发布事件,并且对这些事件感兴趣的每个其他模块都可以愉快地处理它们.没有更多的链接.

但是我会遇到多线程问题吗? …

c# events multithreading eventaggregator caliburn.micro

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

接口继承与通用列表

我想为一个简单的项目构建一个生产者和消费者的通用系统.

我现在拥有的是什么

public interface IMessage     {    }
public interface Message1 : IMessage    {    }
public interface Message2 : IMessage    {    }
public interface IConsumer<T>    {    }
public interface IProducer<T>    {    }

public class Mop1 : IConsumer<Message1>, IProducer<Message2>
{
}



class Program
{
    static void Main(string[] args)
    {
        var list = new List<IConsumer<IMessage>>();
        var mop = new Mop1();
        list.Add(mop);   // Error occurs here
    }
}
Run Code Online (Sandbox Code Playgroud)

最后一行给出了一个错误 cannot convert from 'Mop1' to 'IConsumer<GenericPubSub.IMessage>'

但是Mop1实现了IMessage派生类型的IConsumer.这是一些差异问题吗?这有什么问题?

c# generics interface variance

6
推荐指数
2
解决办法
543
查看次数

在编译时将两个或多个不同大小的数组合并为一个数组

我无法找到有关如何在现代 C++ 中在编译时组合两个或多个数组的答案。

#include <array>
#include <cstdint>

const std::array<std::uint8_t, 1> one_elem = {1};
const std::array<std::uint8_t, 2> two_elem = {2, 3};
const std::array<std::uint8_t, 3> all = {one_elem, two_elem}; 
// expected: all == {1, 2, 3}
Run Code Online (Sandbox Code Playgroud)

我会很高兴任何易于阅读的东西,例如

std::uint8_t one_elem[] = {1};
std::uint8_t two_elem[] = {2, 3};
std::uint8_t all[] = {one_elem, two_elem}; // cannot be that hard
Run Code Online (Sandbox Code Playgroud)

有办法吗?我能做些什么来解决这个问题?

c++ arrays c++14

6
推荐指数
2
解决办法
1459
查看次数

强制执行默认构造函数

可能重复:
定义构造函数签名的接口?

我有类和接口的混合层次结构.

为了使用序列化,我需要在每个类中存在一个默认构造函数.如果编译器可以告诉我在层次结构中某处缺少默认构造函数,我真的很感激.(在编译时看到问题,而不是在后面的测试中)

我想要的可能是一些标记或属性,但我找不到任何东西.

就像是:

[ForceDefaultConstructor]
interface IVeryQuickSerializable
{   
    Serialize();
    Deserialize();
}
Run Code Online (Sandbox Code Playgroud)

会很好!

但是非常感谢.

有一个限制:我无法更改序列化.使它成为通用可以解决问题,但我没有源.编写包装器可能会完成这项工作,但是它会为从顶层序列化接口派生的对象(可能不会更改)带来漏洞.

c# constructor constraints

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

ProtectedData使用哪种加密算法?

对于密码加密,我想使用ProtectedData

据我了解,这是的包装CryptProtectData

MSDN仅声明基于用户凭据的加密含糊之处,并且如果用户没有漫游配置文件,则解密通常必须在同一台计算机上完成。

它使用哪种加密算法?

是否有分析指出这种加密是否适合密码存储?

还应该如何实现本地密码存储?

c# encryption passwords dpapi

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

比较用于排序的枚举值

在一个项目中,我有一个外部枚举(从服务引用生成)。所以我不能改变枚举值。

如何以有效的方式将这些枚举值相互比较?

这里是一个枚举的例子

public enum Values
{
    A,
    B,
    C,
    D,
    E,
    F,
    G,
    H
}
Run Code Online (Sandbox Code Playgroud)

我想要它们的排序顺序不一样(比如 F、H、A、C、B ……)

现在我有一个带有一些比较的扩展方法。(有另一个枚举我想要的顺序)

public static int CompareTo(this Values x, Values y)
    {
        var orderedX = GetOrderedValues(x);
        var orderedY = GetOrderedValues(y);

        return orderedX.CompareTo(orderedY);
    }


internal enum ValuesOrdered
{
    F = 0,
    H = 1,
    C = 2,
    D = 3,
    B = 4,
    A = 5,
    E = 6,
    G = 7
}

internal static ValuesOrdered GetOrderedValues(this Values x)
{
    switch (x)
    {
        case …
Run Code Online (Sandbox Code Playgroud)

c# sorting comparison enums

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

Caliburn.micro与团结

目前我正在学习更多关于caliburn.micro的内容,这真是令人惊叹.

在我的小型演示项目中,有一些导航,有MEF和EventAggregator.

由于我想在一个已经使用统一的项目中使用caliburn.micro,我想使用Unity进行DI.

如何设置引导程序以使用Unity?

除了MindScape教程和codeplex页面上的任何好的教程都非常受欢迎.(除了我没有看到处理这种情况的合适的人)

c# wpf unity-container caliburn.micro

4
推荐指数
2
解决办法
2292
查看次数

用于性能测试的秒表

对于我Stopwatch用于性能测量的一些私人项目.

但是在我想测量的低重复数量的呼叫计数中,我最终得到0 ElapsedMilliseconds,这使得计算平均值变得困难.

我想过写自己的秒表课程.这可能与蜱计算,并给予一个模糊的ElapsedMicroseconds基础上Stopwatch.ElapsedTicksTimeSpan.TicksPerMillisecond.这可能不是一个很好的方法.

我肯定需要一些由winapi的高性能计数器支持的东西,所以datetime等等是不够的.

还有其他想法吗?

c# stopwatch performance-testing

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