Проверка поля универсального типа - PullRequest
1 голос
/ 21 апреля 2011
public static int GetResult<TType>(TType aObject) {
    if(aObject.mValue==12)
        return 99;
    return 20;
}

Как я могу проверить поле mValue TType, я предполагаю, что отражение может прийти в это, но я не уверен, как?

Спасибо.

Ответы [ 3 ]

8 голосов
/ 21 апреля 2011

Обобщения полезны, когда вы хотите сохранить строгую типизацию и безопасность во время компиляции. Если вы собираетесь прибегнуть к Reflection, нет необходимости использовать дженерики. Поэтому одним из способов было бы определить интерфейс или базовый класс, содержащий это свойство:

public interface IFoo
{
    int Value { get; set; }
}

и затем имеют общее ограничение на тип:

public static int GetResult<TType>(TType aObject) where TType: IFoo
{
    if(aObject.Value == 12)
    {
        return 99;
    }
    return 20;
}
2 голосов
/ 21 апреля 2011

Вот шаблон, который я использую:

Сначала создайте интерфейс:

IFoo
{
    int mValue {get; }
}

Затем класс "adhoc", который реализует интерфейс

AdHocIFoo : IFoo
{
    Func<int> get_mValue;

    public AdHocIFoo(Func<int> getValue)
    {
         this.get_mValue = getValue;
    }

    public int mValue { get { return get_mValue(); } }

}

Сейчас, если у вас есть типы, скажем, Bar и Person, определенные следующим образом:

class Bar
{
    public int Baz { get; set; }
}

class Person
{
    public int ID {get; set; }
}

Тогда вы можете использовать код, подобный следующему;

var bar = new Bar() { Baz = 3 };
var per = new Person() { ID = 43 };

var foo1 = new AdHocIFoo(x => bar.Baz);
var foo2 = new AdHocIFoo(x => per.ID);

var result1 = GetResult<AdHocIFoo>(foo1);
var result2 = GetResult<AdHocIFoo>(foo2);
1 голос
/ 21 апреля 2011

Вам нужно ограничить TType, используя ключевое слово 'where', типом или интерфейсом, который, как вы знаете, имеет поле mValue.

Если вы не хотите этого делать, вы можете использовать динамическое ключевое слово например,

dynamic value= aObject
if (value.mValue == 12)
    return 99;
return 20;

Но это должно быть последним средством, так как он потерпит неудачу во время выполнения, если у вашего объекта нет mValue.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...