2015-05-03 2 views
0

Хорошо, поэтому у меня есть известная структура, а это значит, что у меня уже есть члены внутри этой структуры ... Однако у меня есть другие структуры, которые я хочу использовать в 1 вызове функции.Использование T как общего типа для известной структуры?

Это объявление функции в некотором классе:

public void OpenFile<T, F, U>(ref T body, ref F recordMap, ref U records); 

И это вызов для функции в какой-либо другой класс:

OpenFile<SomeStructure1, SomeStructure2, SomeStructure3>(ref someStructureBodyDefinition, ref someStructureRecordMapDefinition, ref someStructureRecordsDefinition); 

Таким образом, чтобы сбросить все это вниз:

Могу ли я использовать любую структуру для вызова функции в родовом типе, и если да, можете ли вы показать мне, как использовать члены структуры внутри функции?

+0

Ваш последний вопрос: «Можете ли вы показать мне, как использовать члены структуры внутри функции», по которой, я думаю, вы имеете в виду, что хотите сделать что-то подобное внутри тела вашего метода OpenFile: 'var x = someStructureBodyDefinition.someMember', то есть вы хотите взаимодействовать с членом структуры. Однако вы не сможете это сделать, если не знаете заранее, что T имеет член с именем 'someMember'. Способ, которым вы можете это знать, заключается в том, что T либо реализует известный интерфейс, либо имеет наследование T от известного базового класса. – DWright

ответ

2

Могу ли я использовать любую структуру для вызова функции в родовом типе, и если да, можете ли вы показать мне, как использовать члены структуры внутри функции?

Хорошо, основанный на отредактированный вопрос кажется вы пытаетесь понять, как использовать экземпляром параметра общего метода, где тип этого параметра является одним из параметров типа метода.

Чтобы сделать это, вы должны иметь возможность обобщать этот параметр типа с ограничением. Поскольку мы говорим о типе значения здесь (то есть struct), единственным возможным таким обобщением может быть тип для реализации интерфейса и для того, чтобы этот интерфейс был объявлен в методе как ограничение.

Например:

interface ISomeInterface 
{ 
    void M1(); 
    string P1 { get; } 
} 

struct MyStruct : ISomeInterface { /* ... */ } 

void Method<T>(T t) where T : ISomeInterface 
{ 
    // can call M1: 
    t.M1(); 

    // can get property value P1: 
    string text = t.P1; 
} 

Если вы будете вызывать этот метод с различными параметрами типа, где типы делают на самом деле реализовать общий интерфейс, но на самом деле не объявлены таковыми (например, все Структуры реализовать M1() метод, но нет ISomeInterface и/или некоторые или все структуры не объявлены как реализация такого интерфейса), то вы можете использовать dynamic, либо вместо того, чтобы этот параметр использовать параметр общего типа вообще, либо назначая переданное значение в локальную переменную dynamic и используя ее.

Если нет способа обобщить используемый тип, то вам следует переосмыслить, действительно ли общий метод действительно хорош. Вероятно, это не так.

Смежные вопросы