ValueTypes的ValueTypes,Strings和Nullable的通用约束

ant*_*ioh 6 c# generics lambda constraints

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

问题是:

  • 值类型是struts
  • 字符串是不可变的引用类型
  • nullable是值类型,但不会在"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
Run Code Online (Sandbox Code Playgroud)

上述三个呼叫都应该被接受,但不是以下内容:

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

提前致谢

更新:感谢Anton和Marc.MyGenericMethod有4个不同的签名接受额外的参数,这就是为什么我不喜欢为每个现有的4创建3个不同的(struct,nullable,string)的想法...这将是一个噩梦来维护!

Ant*_*lev 7

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

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

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

MyGenericFunction(string s)
Run Code Online (Sandbox Code Playgroud)

更新鉴于方法存在各种重载,我可以建议:

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
}
Run Code Online (Sandbox Code Playgroud)

因此你的方法变成了

MyGenericMethod(Holder h);
Run Code Online (Sandbox Code Playgroud)

仍然非常麻烦,但它可能会成功.