小编And*_*lon的帖子

确定类是否实现了非常特定的接口

关于这个主题有很多问题,但我的版本略有改动.

我们有以下代码:

interface IFoo { }
interface IBar : IFoo { }
class Foo : IFoo { }
class Bar : IBar { }

bool Implements_IFoo(Type type) { /* ??? */ }
Run Code Online (Sandbox Code Playgroud)

现在,故事的转折:Implements_IFoo当Type仅实现IFoo而不是从IFoo派生的任何接口时,该方法应该只返回true.这里举例说明此方法的一些示例:

Implements_IFoo(typeof(Foo)); // Should return true

Implements_IFoo(typeof(Bar)); // Should return false as Bar type 
                              // implements an interface derived from IFoo
Run Code Online (Sandbox Code Playgroud)

请注意,可能有许多从IFoo派生的接口,您不一定知道它们的存在.

显而易见的方法是通过反射找到从IFoo派生的所有接口,然后只检查typeof(Bar).GetInterfaces()就是那里存在的任何一个.但我想知道是否有人可以提出更优雅的解决方案.

PS问题源于我发现的一些代码,它们使用了对class(if(obj.GetType() == typeof(BaseClass)) { ... })的检查.我们正在用特定代码的接口替换类.另外,以防万一 - 我将此检查作为布尔标志实现,所以这个问题纯粹是假设的.

c# reflection inheritance interface

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

现在VS 2012发布后,是否正确使用Async和VS 2010?

由于工作限制,我需要在不久的将来继续使用Visual Studio 2010.与此同时,我在个人编码中一直在学习Async.最新的Async CTP是否与C#5.0的Async语言功能完全一致?并且正在安装Async CTP正确使用VS2010的Async吗?

c# visual-studio-2010 async-await async-ctp visual-studio-2012

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

在Json.net中使用自定义JsonConverter和TypeNameHandling

我有一个类接口类型的类,如:

public class Foo
{
    public IBar Bar { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我还有IBar可以在运行时设置的接口的多个具体实现.其中一些具体类需要自定义JsonConverter进行序列化和反序列化.

利用该TypeNameHandling.Auto选项,非转换器需要IBar类可以完美地序列化和反序列化.另一方面,自定义序列化的类没有$type名称输出,虽然它们按预期序列化,但它们不能反序列化为它们的具体类型.

我试图$type在自定义中自己写出名称元数据JsonConverter; 但是,在反序列化时,转换器将被完全绕过.

是否有解决方法或处理此类情况的正确方法?

c# json.net

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

模式匹配变量范围

Roslyn模式匹配规范中,它指出:

模式变量的范围如下:

如果模式出现在if语句的条件中,则其作用域是if语句的条件和受控语句,而不是其else子句.

然而,最新的Microsoft"What's new" 帖子演示文稿显示了这个例子:

public void PrintStars(object o)
{
    if (o is null) return;     // constant pattern "null"
    if (!(o is int i)) return; // type pattern "int i"
    WriteLine(new string('*', i));
}
Run Code Online (Sandbox Code Playgroud)

其中显示了在模式匹配i的if级别范围之外使用的模式匹配变量.

这是一个疏忽,还是从规范中改变了范围?

c# pattern-matching c#-7.0

11
推荐指数
2
解决办法
798
查看次数

可以编译C#5.0的哪些功能以在.net 4.0上运行

我希望框架级别更新(例如async)无法编译为在较低的框架上工作,但编译器差异(例如foreach循环变量范围)在使用C#5.0针对.net 4.0编译时是否正常工作?任何人都可以提供明确的清单吗?

编辑:

而不是要求一个确定的列表,我将其作为很多要求回过头来,任何人都能够回答编译器级别更改(如foreach变量范围)在使用C#5.0对抗早期框架版本时的行为会有所不同.

c# c#-5.0

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

关闭WPF默认UI动画(复选框等)

我打算使用默认的Aero主题但是对于在检查复选框时发生的淡入以及其他一些"闪烁"效果(例如按钮脉冲)不满意.

有没有办法在不重新模板控件的情况下关闭这些效果/动画?

非常感谢你.

wpf

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

C#通用铸造异常

我在使用泛型时遇到了一个奇怪的转换问题.下面的代码将抛出一个InvalidCastException尽管明显int可以强制转换为a double.谁能解释这种行为以及如何绕过它?

public class TestClass<T>
{
    public T Cast(object o)
    {
        return (T)o;
    }
}

public void Main()
{
    TestClass<double> w = new TestClass<double>();
    double x = w.Cast(10);
}
Run Code Online (Sandbox Code Playgroud)

编辑:

因为我在.net 4.0土地上无论如何我改变它使用'动态'而不是'对象',一切都按预期工作.欣赏所有现场和快速回复.

.net c# generics casting

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

C#获取对象的实际TypeDescriptionProvider或TypeDescriptor

我意识到这是一个不寻常的问题,但是:

我创建了一个自定义TypeDescriptionProvider,它可以TypeDescriptors根据请求的对象类型存储和返回不同的.然而,我注意到无论TypeDescriptionProvider与Type(be-it custom或default)相关联,TypeDescriptor.GetProvider()总是返回一个(内部类)System.ComponentModel.TypeDescriptor.TypeDescriptionNode对象(实际的某种包装器TypeDescriptionProvider).反过来调用GetTypeDescriptor()这个对象总是返回一个System.ComponentModel.TypeDescriptor.TypeDescriptionNode.DefaultTypeDescriptor对象(另一个包装器),而陌生人仍然没有调用TypeDescriptionProvider实际的GetTypeDescriptor()方法.

这是否意味着无法从提供者那里找回对象的实际内容TypeDescriptionProvider或其实际内容TypeDescriptor?返回类名,属性等的方法仍然按预期工作DefaultTypeDescriptor,但我无法比较或找出两个对象是否使用相同的TypeDescriptor(这是我目前需要的).

有谁知道如何获得实际的TypeDescriptionProvider,或从包装的提供者获得实际的TypeDescriptor?

先感谢您.

例如:

public class TestTypeDescriptionProvider : TypeDescriptionProvider
{
    private static Dictionary<Type, ICustomTypeDescriptor> _descriptors = new Dictionary<Type, ICustomTypeDescriptor>();

    ...static method to add to the cache...

    public override ICustomTypeDescriptor GetTypeDescriptor(Type objectType, object instance)
    {
        if (objectType == null)
            return _descriptors[instance.GetType()];

        return _descriptors[objectType];
    }
}

...    

TypeDescriptionProvider p = TypeDescriptor.GetProvider(obj.GetType()); …
Run Code Online (Sandbox Code Playgroud)

c#

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

TextBox模板填充问题

我试图重新模板a TextBox有两个边框填充介于两者之间; 但是,即使我明确地将PART_上的填充设置ContentHost为零,控件的填充也始终应用于内部ScrollViewer.

小例子:

<Style TargetType="{x:Type TextBox}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type TextBox}">
                <Border Padding="{TemplateBinding Padding}"
                        BorderThickness="1"
                        BorderBrush="Black"
                        Background="LightBlue">
                    <ScrollViewer Padding="0" Margin="0" Background="Turquoise"
                                  x:Name="PART_ContentHost" />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<TextBox Padding="15"/>
Run Code Online (Sandbox Code Playgroud)

结果是一个文本框,如下所示:[15 [15 Textfield 15] 15]

虽然我只期望:[15 [ Textfield ] 15]

如何正确强制PART_ContentHost(scrollviewer/textfield)填充零?

wpf textbox wpf-controls wpf-4.0

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

WPF 4:PropertyChanged 不更新绑定

在我的 ViewModel 中,我有一个带有子属性“B”的类“A”,它也是一个自定义类。这两个类都实现了 INotifyPropertyChanged 并且 B 的 PropertyChanged 事件被连接起来以触发 A 的 PropertyChanged 事件(具有正确的属性名称“B”)。

我的 ViewModel 上也有一个 DependencyProperty“DPB”,它通过一个非常简单的绑定(new Binding(“AB”))绑定到代码中的 B。

现在我的视图中有三个文本框:

  • 1 绑定到 ABC(B 的属性)
  • 1 直接绑定到 AB
  • 1 绑定到 DPB

第一次运行时,AB 和 DPB 文本框都显示正确的值。但是当我更改 ABC 文本框时,只有 AB 文本框会更新 - DPB 文本框不会更新。

我已经调试了所有的 PropertyChanged 通知代码,它们都被正确传递的值击中。

问题似乎是在触发 PropertyChanged 事件时没有更新 DependencyProperty(或其绑定)。谁能告诉我为什么或如何改变这种行为?

谢谢你。

c# wpf binding

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