相关疑难解决方法(0)

如何为班级提供自定义演员支持?

如何提供将我的课程转换为其他类型的支持?例如,如果我有自己的管理a的实现byte[],并且我想让人们将我的类转换为a byte[],这将只返回私有成员,我该怎么做?

通常的做法是让他们也将它转换为字符串,还是应该覆盖ToString()(或两者)?

c# casting

91
推荐指数
3
解决办法
5万
查看次数

在JSON.NET中反序列化IList <Interface>

我有一些要反序列化的json。将序列反序列化很容易,但是我正在使用接口,这就是我需要反序列化的结果:

因此,让我们从一些JSON开始:

[{"TimeGenerated":"2017-05-30T19:21:06.5331472+10:00","OuterValue":1.08,"Identifier":{"IdentifierName":"BLA","IdentifierNumber":1},"Locale":{"LocaleName":"LOCALE NAME","LocaleType":1,"LocaleNumber":1,"StartTime":"2017-05-30T19:20:00+10:00"},"InnerValue":1.08,"InnerType":0,"InnerId":"InnerI","Type":"MyType","Id":"11111"}]
Run Code Online (Sandbox Code Playgroud)

这是在服务器端进行序列化的数据(当然没有问题),其对象类型为:

IList<IRootObject>
Run Code Online (Sandbox Code Playgroud)

如此有效,我想反序列化为:

IList<IRootObject> MyDeserialisedObject = JsonConvert.Deserialise<IList<IRootObject>>(JsonString);
Run Code Online (Sandbox Code Playgroud)

显然,这里的泡菜是以下的旧界面/抽象类型错误:

'Could not create an instance of type BLA. Type is an interface or abstract class and cannot be instantiated'
Run Code Online (Sandbox Code Playgroud)

很好,我创建了一些自定义转换器,并进行了如下装饰:

类是:

    [JsonObject(MemberSerialization.OptIn)]
    public class Identifier
    {
        [JsonProperty]
        public string IdentifierName { get; set; }
        [JsonProperty]
        public int IdentifierNumber { get; set; }
    }
    [JsonObject(MemberSerialization.OptIn)]
    public class Locale
    {
        [JsonProperty]
        public string LocaleName { get; set; }
        [JsonProperty]            
        public int LocaleType { get; set; }
        [JsonProperty]            
        public int LocaleNumber …
Run Code Online (Sandbox Code Playgroud)

c# json json.net deserialization

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

仅允许将特定对象类型传递到基于派生类类型的方法

我有一个基类,它有一个方法调用AddFruit,它接受一个类的Fruit类并以一般方式处理它.

    public abstract class Foo
    {
        protected List<ProcessedFruit> processedFruit = new List<ProcessedFruit>();

        public void AddFruit(Fruit o)       
        {
            // Process fruit

            processedFruit.Add(o);
        }

        public void Update()
        {
            // Do base class specific stuff here
            OnUpdate();
        }

        protected abstract void OnUpdate();
    }

    public class AppleBar : Foo
    {
        public AppleBar()
            :base(){}

        protected override void OnUpdate() { }
    }

    public class BananaBar : Foo
    {
        public BananaBar()
            :base(){}

        protected override void OnUpdate() { }
    }
Run Code Online (Sandbox Code Playgroud)

任何派生的类都Foo以非一般方式更新,并ProcessedFruit …

c# derived-class

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

为什么 List&lt;Parent&gt; 允许添加新的 Child 但不允许从 List&lt;Child&gt; 分配

这可能是重复的。但经过一天的研究,我希望得到你的宽大处理。这是一个关于协方差的问题。

为什么我可以做到这一点?

List<Animal> allAnimals = new List<Animal>();
allAnimals.Add(new Dog());
allAnimals.Add(new Cat());
Run Code Online (Sandbox Code Playgroud)

但不能这样做吗?

List<Dog> aBunchOfDogs = new List<Dog>();
allAnimals = aBunchOfDogs;
Run Code Online (Sandbox Code Playgroud)

我读过一些关于协方差的讨论。

“C# 中的协方差”

“将列表转换为接口列表”

“将列表投射到接口列表”

我的理解是,我不能将狗列表添加到动物列表中,因为这样我可以将猫添加到动物列表中,这将是危险的。但是将猫或狗的单个实例添加到动物列表中也同样危险,不是吗?在我看来,C# 还没有决定是否信任我。

c# casting list covariance

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