‘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类型。 想想它一分钟,编译器怎么知道保证类型TSpreadsheetLineNumbers属性? 如果T是原始类型,如intobject怎么办?

是什么阻止我们用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(ref StringBuilder outputTableContent, string lineNumbers)