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

时间:2009-04-08 08:36:47

标签: 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

上面的三个电话都应该被接受,但不能接受以下内容:

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

提前致谢

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

1 个答案:

答案 0 :(得分:7)

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

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

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

MyGenericFunction(string s)

UPDATE 鉴于方法存在各种重载,我建议:

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);

仍然非常麻烦,但它可能会有效。