我有一個Product
類型的對象和Variant
類型的對象。 Variant
和Product
具有相同的結構,但是是兩種不同的類型,所以我不能只用一種方法來包含兩者。是否有可能制定一種可接受這兩種類型的擴展方法?多種類型的擴展方法
回答
除非Product
和Variant
具有公共基類或接口,否則不能這樣做。
如果他們有共同的基類或接口,那麼你可以嘗試寫它的擴展方法,例如,
public static void MyMethod(this ICommonInterface obj) {}
否則,您將不得不創建兩個單獨的擴展方法。您可以嘗試將通用代碼提取到將從您的擴展方法調用的單獨方法中。
你可以採取dynamic
類型的優勢:
using System.Linq;
class Program
{
static void Main(string[] args)
{
var myList = new object[] {
new Product(){Id=1},
new Variant(){Id=1}
};
Process(myList);
}
static void Process(object[] myList)
{
foreach (dynamic item in myList)
{
item.Id += 1;
}
}
}
class Product
{
public int Id { get; set; }
public string Name { get; set; }
public string Foo { get; set; }
}
class Variant
{
public int Id { get; set; }
public string Name { get; set; }
public string Bar { get; set; }
}
pub
使用擴展方法:
public static class X
{
public static void Process(this object[] myList)
{
foreach (dynamic item in myList)
{
item.Id += 1;
}
}
}
和樣本用法:
myList.Process();
另一種選擇
...是使用對象對象映射器,如AutoMapper。對於樣品上方Product
和Variant
樣品類型,你將不得不與以下類型這股2類的共同成員定義成員映射:
public class MyMapper
{
public int Id { get; set; }
public string Name { get; set; }
}
成員映射如下所示:
Mapper.CreateMap<Product, MyMapper>()
.ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id))
.ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Name));
Mapper.CreateMap<Variant, MyMapper>()
.ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id))
.ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Name));
,你可能會得到一個工作List<MyMapper>
這樣的:
var myMapperList = myList.Select(item => item.Map()).ToList();
的Map<T>
前拉法:
public static MyMapper Map<T>(this T obj)
{
return (MyMapper)Mapper.Map(obj, obj.GetType(), typeof(MyMapper));
}
從這個角度進一步,你將定義爲MyMapper
類型的擴展方法。
Steve,
從Commerce Server的角度來看這個問題的兩個可能的答案。取決於您是在討論Core Systems API還是Commerce Foundation API。我會在下面兩個地址:
選項1:商業服務器核心系統API
不幸的是,這兩類產品和變體不共享一個公共基類(除非你把System.Object的;-) 。儘管Microsoft.CommerceServer.Catalog.Product繼承自Microsoft.CommerceServer.Catalog.CatalogItem,但Variant不會繼承自CatalogItem或任何其他常見基類。變體直接從System.Object繼承。
因此,您無法編寫兩個類都可以使用的擴展方法。
類定義文檔中的所有目錄系統對象(核心系統API),可以在這裏找到http://msdn.microsoft.com/en-us/library/microsoft.commerceserver.catalog(v=cs.70).aspx
選項2:商會基金API 如果你指的是產品和對於從對Commerce Commerce的調用返回的對象的變體,則使用Commerce Server操作服務請求返回的所有對象作爲ICommerceEntity類型返回。
如果您使用具體的數據類型來包裝CommerceEntity,那麼您仍然可以使用.ToCommerceEntity()方法,並且您可以從ICommerceEntity編寫擴展。這種方法唯一的問題是從ICommerceEntity繼承的所有類將能夠使用擴展方法。
查看http://msdn.microsoft.com/en-us/library/dd451701.aspx爲了瞭解更多關於商會基金的具體數據類型。
您不能更改Product和Variant類,但可以對它們進行子類化並將接口應用於子類。此接口可用於擴展方法:
using System;
public class Program
{
public static void Main()
{
var p = new MyProduct();
p.Name = "test";
Console.WriteLine(p.GetName());
}
}
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public string Foo { get; set; }
}
public class Variant
{
public int Id { get; set; }
public string Name { get; set; }
public string Bar { get; set; }
}
public class MyProduct: Product, IType {
}
public class MyVariant: Variant, IType {
}
public static class Extensions {
public static string GetName(this IType type){
return type.Name;
}
}
public interface IType {
string Name {get; set; }
}
- 1. 有沒有辦法編寫適用於多種類型的擴展方法?
- 2. 這種類型爲「Type」的擴展方法爲空
- 3. 返回通用擴展兩種類型的工廠方法
- 4. python內置類型的擴展方法!
- 5. 擴展方法中的類型推斷
- 6. 擴展類成員的擴展方法?
- 7. 使用擴展方法的擴展類
- 8. 擴展類方法
- 9. 如何確定一種方法「是否是類型的擴展方法?」
- 10. 與泛型參數擴展多種類型的靜態字段
- 11. 抽象類擴展了多種類型的活動Java和Android
- 12. 一種方法,採取多種類型
- 13. 與類型約束擴展方法
- 14. 擴展方法,返回接口類型
- 15. 通用類型擴展方法ToMultidimensionalArray
- 16. 擴展方法和類型推斷
- 17. 強類型LINQ擴展方法
- 18. 將通用類型轉換爲另一種通用類型擴展方法
- 19. 擴展方法擴展靜態類
- 20. 將擴展方法應用於泛型類型泛型類型
- 21. 是否可以使用擴展方法擴展泛型類?
- 22. 通用方法]擴展JAVA中的多個類型參數
- 23. 擴展擴展類型
- 24. 帶多種返回類型的方法
- 25. 方法中的多種返回類型?
- 26. 擴展方法與泛型
- 27. 泛型擴展方法
- 28. 擴展原型方法
- 29. 用於縮略圖多種擴展類型的工具
- 30. 擴展BaseClass方法(多態)
如果他們有相同的「結構」,然後創建一個接口定義的結構,並同時擁有你的類實現該接口。 – mbeckish
產品和變體類型來自第三方API,我無權訪問其上的接口。 – sk099
您可以定義自己的實現此接口的類,並在該類上提供方法以將屬性值從'Product'或'Variant'複製到其自己的屬性中。 – mbeckish