小编Tot*_*oto的帖子

通过两个不同的接口访问同一对象

我有两个接口:

interface IStudent
{
    string Name { get; }
    string EducationLevel { get; }
}

interface ITeacher
{
    string Name { get; }
    string Department { get; }
}
Run Code Online (Sandbox Code Playgroud)

你会如何在C#中设计它,以便一个对象可以

  1. 仅实施学生(并且没有教师的财产)
  2. 仅实施教师​​(并且没有结果的属性)
  3. 实现两个接口而没有commone属性的冗余(Name)

任何想法 ?

我可以做两个直接实现两个接口的类.但对于一个既是老师又是学生的人,我将有两个不同的对象:我只想要一个!

c# object

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

ConstantExpression不是常量

给定Msdn:一个constant-expression是一个可以在编译时完全评估的表达式.

但是在下面的示例代码中,我有一个无法在编译时评估的contantExpression.

我应该错过什么,但是什么?

public class SomeClass
{
    public string Key { get; set; }
}

public static void Sample()
{
    var wantedKey = Console.ReadLine();
    Expression<Func<SomeClass, bool>> expression = c => c.Key == wantedKey;

    var maybeAConstantExpression = ((MemberExpression)((BinaryExpression)expression.Body).Right).Expression;

    //Both are true, so we have a constantExpression,righ and Value should be known
    Console.WriteLine(maybeAConstantExpression.NodeType == ExpressionType.Constant);
    Console.WriteLine(maybeAConstantExpression.GetType() == typeof(ConstantExpression));

    var constantExpression = ((ConstantExpression)maybeAConstantExpression);
    var constantValue = constantExpression.Value;

    //ConsoleApplication1.Program+<>c__DisplayClass0
    //Do not looks like a constant..this is a class...
    Console.WriteLine(constantValue);

    var fakeConstantValue = constantValue.GetType().GetField("wantedKey").GetValue(constantValue);
    //Return …
Run Code Online (Sandbox Code Playgroud)

c# expression-trees

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

而循环到linq

有没有办法用linq积累一些东西.

初始代码:

Something oneItem;
List<Something> allItems;
while ((oneLine = _generator.GenerateSomething()) != null)
    allItems.Add(_generator.CurrentItem);
Run Code Online (Sandbox Code Playgroud)

我想要像:

var allItems = Enumerable.Take( ()=>_generator.GenerateSomething()).While(item=>item !=null).ToList();
Run Code Online (Sandbox Code Playgroud)

实际上,如果生成器实现IEnumerable会非常好,我会这样使用它:

var allItems = _generator.TakeWhile(item !=null);
Run Code Online (Sandbox Code Playgroud)

最后一个很容易理解,我想解决它(我可以使用一种生成机器状态的包装器,给出一个生产方法(_generator.GenerateSomething())和一个停止条件(item == null).但我不能写这个额外的类或某些原因).

c# linq

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

C#泛型缓存,类型安全

我正在寻找一种方法来为任何对象提供通用的本地缓存.这是代码:

    private static readonly Dictionary<Type,Dictionary<string,object>> _cache 
        = new Dictionary<Type, Dictionary<string, object>>();

    //The generic parameter allow null values to be cached
    private static void AddToCache<T>(string key, T value)
    {
        if(!_cache.ContainsKey(typeof(T)))
            _cache.Add(typeof(T),new Dictionary<string, object>());

        _cache[typeof (T)][key] = value;
    }

    private static T GetFromCache<T>(string key)
    {
        return (T)_cache[typeof (T)][key];
    }   
Run Code Online (Sandbox Code Playgroud)

1-有没有办法不使用getfromcache方法?

2-有没有办法确保第二个字典中的类型安全,说所有对象都具有相同的类型.(这是由addToCache方法提供的,但我更喜欢设计中的类型控件).例如,要具有以下类型的_cache

    Dictionary<Type,Dictionary<string,typeof(type)>>
Run Code Online (Sandbox Code Playgroud)

谢谢

c# generics caching

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

C#"验证"绑定到表单的对象的最佳方法

我有一个业务对象绑定到一个窗体(每个属性绑定到一个控件).有一些业务规范(例如此字段不应为空,此字段必须大于等等...).检查所有规则的最佳方法是什么?

我目前在每个控件上都有一个验证器,所以我可以检查所有验证器是否正常,但我真的不喜欢这个解决方案.事实上,这些规则已被分发,并且不容易立即看到所有规则.

我可以有一个检查所有规则的大方法CheckValidaty,但这会导致与验证器的双重检查.

你会做什么,其他解决方案?

c# forms validation winforms

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

为什么可以为Nullable变量赋值?

为什么下面的行编译?对我来说,Nullable<double>是一个结构,我们不能为这种类型的变量赋值"null".

        Nullable<double> someVar = null;
Run Code Online (Sandbox Code Playgroud)

赋值运算符不应该是可覆盖的,但可能是一些语法糖,编译器知道它必须将其更改为?

        Nullable<double> someVar = new Nullable<double>();
        someVar.Value = null;
Run Code Online (Sandbox Code Playgroud)

c# nullable

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

C#最好的方法是在一个对象上调用.ToString()

如何在类型为object的对象上调用.ToString()方法,该对象可以为null.我目前正在做以下事情,但它很长:

  myobject == null ? null : myobject.ToString()
Run Code Online (Sandbox Code Playgroud)

c# rewrite

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