关于这个主题有很多问题,但我的版本略有改动.
我们有以下代码:
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)) { ... }
)的检查.我们正在用特定代码的接口替换类.另外,以防万一 - 我将此检查作为布尔标志实现,所以这个问题纯粹是假设的.
由于工作限制,我需要在不久的将来继续使用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
我有一个类接口类型的类,如:
public class Foo
{
public IBar Bar { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我还有IBar
可以在运行时设置的接口的多个具体实现.其中一些具体类需要自定义JsonConverter进行序列化和反序列化.
利用该TypeNameHandling.Auto
选项,非转换器需要IBar
类可以完美地序列化和反序列化.另一方面,自定义序列化的类没有$type
名称输出,虽然它们按预期序列化,但它们不能反序列化为它们的具体类型.
我试图$type
在自定义中自己写出名称元数据JsonConverter
; 但是,在反序列化时,转换器将被完全绕过.
是否有解决方法或处理此类情况的正确方法?
在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级别范围之外使用的模式匹配变量.
这是一个疏忽,还是从规范中改变了范围?
我希望框架级别更新(例如async)无法编译为在较低的框架上工作,但编译器差异(例如foreach循环变量范围)在使用C#5.0针对.net 4.0编译时是否正常工作?任何人都可以提供明确的清单吗?
编辑:
而不是要求一个确定的列表,我将其作为很多要求回过头来,任何人都能够回答编译器级别更改(如foreach变量范围)在使用C#5.0对抗早期框架版本时的行为会有所不同.
我打算使用默认的Aero主题但是对于在检查复选框时发生的淡入以及其他一些"闪烁"效果(例如按钮脉冲)不满意.
有没有办法在不重新模板控件的情况下关闭这些效果/动画?
非常感谢你.
我在使用泛型时遇到了一个奇怪的转换问题.下面的代码将抛出一个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土地上无论如何我改变它使用'动态'而不是'对象',一切都按预期工作.欣赏所有现场和快速回复.
我意识到这是一个不寻常的问题,但是:
我创建了一个自定义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) 我试图重新模板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)填充零?
在我的 ViewModel 中,我有一个带有子属性“B”的类“A”,它也是一个自定义类。这两个类都实现了 INotifyPropertyChanged 并且 B 的 PropertyChanged 事件被连接起来以触发 A 的 PropertyChanged 事件(具有正确的属性名称“B”)。
我的 ViewModel 上也有一个 DependencyProperty“DPB”,它通过一个非常简单的绑定(new Binding(“AB”))绑定到代码中的 B。
现在我的视图中有三个文本框:
第一次运行时,AB 和 DPB 文本框都显示正确的值。但是当我更改 ABC 文本框时,只有 AB 文本框会更新 - DPB 文本框不会更新。
我已经调试了所有的 PropertyChanged 通知代码,它们都被正确传递的值击中。
问题似乎是在触发 PropertyChanged 事件时没有更新 DependencyProperty(或其绑定)。谁能告诉我为什么或如何改变这种行为?
谢谢你。
c# ×8
wpf ×3
.net ×1
async-await ×1
async-ctp ×1
binding ×1
c#-5.0 ×1
c#-7.0 ×1
casting ×1
generics ×1
inheritance ×1
interface ×1
json.net ×1
reflection ×1
textbox ×1
wpf-4.0 ×1
wpf-controls ×1