‘T’不包含定义
是否有可能做到以下(如果是这样我似乎无法让它工作..暂时放弃约束)…
如果推断出类型(因为它被省略),那么问题是什么?
private void GetGenericTableContent(ref StringBuilder outputTableContent, T item) { outputTableContent.Append("" + item.SpreadsheetLineNumbers + " "); } // 'item' is either DuplicateSpreadsheetRowModel class or SpreadsheetRowModel class
使用上面的代码我收到以下错误:
‘T’不包含’SpreadsheetLineNumbers’的定义,并且没有扩展方法’SpreadsheetLineNumbers’可以找到接受类型’T’的第一个参数(你是否缺少using指令或汇编引用?)
不,这是不可能的。 必须在编译时知道generics类型。 想想它一分钟,编译器怎么知道保证类型T
有SpreadsheetLineNumbers
属性? 如果T
是原始类型,如int
或object
怎么办?
是什么阻止我们用ref _, 999
参数调用方法(这里的T是int)?
它只有在我们添加包含此属性的接口时才有效:
public interface MyInterface { string SpreadsheetLineNumbers { get; set; } }
让你的类inheritance这个接口
public class MyClass : MyInterface { public string SpreadsheetLineNumbers { get; set; } }
然后使用generics约束让编译器知道此类型是从此接口inheritance的,因此它必须包含其所有属性。
private void GetGenericTableContent(ref StringBuilder outputTableContent, T item) where T : IMyInterface // now compiler knows that T type has implemented all members of the interface { outputTableContent.Append("" + item.SpreadsheetLineNumbers + " "); }
如果你不能为你的类型(或几种类型之间的通用)创建一个接口:
private void GetGenericTableContant(ref StringBuilder outputTableContent, T item, Func lineNumberAccessor) { outputTableContent.Append("" + lineNumberAccessor(item) + " "); }
用法:
GetGenericTableContent(ref outputTableContent, item, x => x.SpreadsheetLineNumbers);
(或者,如果您不需要方法中的项引用,则可以传递SpreadSheetLineNumbers属性: void GetGenericTableContant
)