gpt4 book ai didi

c# - 对 ValueTypes、Strings 和 ValueTypes 的 Nullable 的通用约束

转载 作者:太空狗 更新时间:2023-10-29 21:31:43 25 4
gpt4 key购买 nike

我正在尝试向泛型方法添加约束,以便它检查 ValueTypes、Strings 或 Nullable 值类型。

问题在于:

  • 值类型是 struts
  • 字符串是不可变的引用类型
  • 可为空的是值类型,但不会在“where S : struct”类型约束中被接受。

那么有人知道是否有一种方法可以在通用约束中接受这些类型并且只接受这些类型吗?

问题是我正在尝试接受 Expression<Func<T, S>代表给定对象的这些类型的属性的参数。

功能类似于以下内容(请注意代码没有任何意义,只是让您快速了解我正在寻找的内容):

public class Person
{
public string Name {get; set;}
public DateTime? DOB {get; set;}
public int NumberOfChildren {get; set;}
public Car CurrentCar {get; set;}
}

---

internal void MyGenericMethod<T, S>(T myObject, Expression<Func<T, S> property){...}

Person myPerson = new Person();
MyGenericMethod(myPerson, p => p.Name); //S would be a string
MyGenericMethod(myPerson, p => p.DOB); //S would be a DateTime?
MyGenericMethod(myPerson, p => p.NumberOfChildren); //S would be a struct

上面的三个调用都应该被接受,但下面的不被接受:

MyGenericMethod(myPerson, p => p.CurrentCar); //S would be a class and shouldn't compile

提前致谢

更新:感谢 Anton 和 Marc。 MyGenericMethod 有 4 个不同的签名接受额外的参数,这就是为什么我不喜欢为现有的 4 个中的每一个创建 3 个不同的(结构、可空、字符串)的想法......这将是一场噩梦!

最佳答案

我唯一能想出的是一组三个函数(没有 Expression<> 东西):

MyGenericFunction<T>(T t)
where T : struct

MyGenericFunction<T>(T? t)
where T : struct

MyGenericFunction(string s)

更新 鉴于方法有多种重载,我可以建议:

class Holder
{
private object value;

public Holder(object value)
{
this.value = value;
}

public static implicit operator Holder(DateTime dt)
{
return new Holder(dt);
}

public static implicit operator Holder(string s)
{
return new Holder(s);
}

// Implicit conversion operators from primitive types
}

这样你的方法就变成了

MyGenericMethod(Holder h);

仍然很麻烦,但它可能会成功。

关于c# - 对 ValueTypes、Strings 和 ValueTypes 的 Nullable 的通用约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/729061/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com