6

我正在尝试向通用方法添加一个约束,以便它检查 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

提前致谢

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

4

1 回答 1

7

我唯一能想到的是一组三个功能(没有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);

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

于 2009-04-08T08:43:56.687 回答