小编Jan*_*n S的帖子

带有可选参数的构造函数违反new()约束

我有一个这个构造函数的类:

public Currency(Guid? vcurrencyUI = null)
    : base(vcurrencyUI)
{ }
Run Code Online (Sandbox Code Playgroud)

我想使用带有new()约束的类,但是我收到此错误:

'Currency'必须是具有公共无参数构造函数的非抽象类型,才能在泛型类型或方法中将其用作参数'T'...

如果我拆分构造函数一切正常:

public Currency(Guid? vcurrencyUI)
    : base(vcurrencyUI)
{ }

public Currency()
    : base()
{ }
Run Code Online (Sandbox Code Playgroud)

为什么我需要拆分构造函数?

c# generics constructor constraints

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

反序列化为自定义列表

我创建了一个自定义List类,它出于性能原因维护一组项ID:

public class MyCustomList : List<ItemWithID>
{
    private HashSet<int> itemIDs = new HashSet<int>();

    public MyCustomList()
    {
    }

    [JsonConstructor]
    public MyCustomList(IEnumerable<ItemWithID> collection)
        : base(collection)
    {
        itemIDs = new HashSet<int>(this.Select(i => i.ID));
    }

    public new void Add(ItemWithID item)
    {
        base.Add(item);
        itemIDs.Add(item.ID);
    }

    public new bool Remove(ItemWithID   item)
    {
        var removed = base.Remove(item);
        if (removed)
        {
            itemIDs.Remove(item.ID);
        }
        return removed;
    }

    public bool ContainsID(int id)
    {
        return itemIDs.Contains(id);
    }
}
Run Code Online (Sandbox Code Playgroud)

我想从一个简单的JSON数组反序列化这个List,例如:

JsonConvert.DeserializeObject<MyCustomList>("[{ID:8},{ID:9}]");
Run Code Online (Sandbox Code Playgroud)

这将导致JSON.NET仅调用空构造函数,因此我的itemID列表仍为空.此外,不调用Add方法.

JSON.NET如何将项添加到列表中,以便我可以在该位置添加逻辑.

(这是关于没有应该在json字符串中持久化的属性的反序列化,因此建议的重复问题与此问题无关)

c# inheritance json json.net

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

泛型方法从超类获取参数类型

我在C#中的类型化方法有问题。我想调用对象的继承方法。该方法调用以“ this”为参数的静态方法。静态方法的参数是通用的。现在,我希望此参数的通用类型是第一个对象的类型。但是参数始终具有抽象类的类型。

这是示例:

abstract class AbstractClass
{
    bool update()
    {
        Connection.Update(this);
    }
}

class Entity : AbstractClass
{
}

class Connection
{
    public static void Update<T>(T obj)
    {
        someMethod<T>()
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我尝试这样做:

Entity foo = new Entity();
foo.update();
Run Code Online (Sandbox Code Playgroud)

Connection.Update将在调试器中如下所示:

public static void Update<AbstractClass>(AbstractClass obj)
{
    someMethod<AbstractClass>()
}
Run Code Online (Sandbox Code Playgroud)

但是我想要这个:

public static void Update<Entity>(Entity obj)
{
    someMethod<Entity>()
}
Run Code Online (Sandbox Code Playgroud)

有没有可能

someMethod<typeof(obj)>()
Run Code Online (Sandbox Code Playgroud)

还是要解决我的问题?

c# generics inheritance this

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

属性的自定义 JsonConverter:获取属性名称

我有一个用于 guid 属性的示例转换器:

public class CustomGuidConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof (Guid?) || objectType == typeof (Guid);
    }

    public override void WriteJson(JsonWriter writer, object oldValue, JsonSerializer serializer)
    {
        if (value != null)
        {
            var newValue = convert(oldValue); // do some conversion
            writer.WriteValue(newValue);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

像这样使用它:

public class Outer {
    public int Id { get; set; }

    [JsonConverter(typeof(InterfaceLabelConverter))]
    public Guid? ProductFamilyId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

如何在WriteJson方法中访问当前属性的名称?我想用另一个属性名将旧值写入 writer,如下所示:

{ Id: …
Run Code Online (Sandbox Code Playgroud)

c# json.net

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

为什么我需要协方差接口(输出类型)?

我只需要再次使用协变out泛型类型修饰符.我有一个泛型类的类,想要添加一个out但是VS告诉我这只能在接口上实现.

但为什么我out只能在界面上使用修饰符呢?

我帮助自己创建了我的类的接口副本,但这对我来说似乎有点奇怪,只有一个接口所以我可以使用这个修饰符.

c# generics covariance

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