精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

C# 9 新特性:代碼生成器、編譯時(shí)反射

新聞 前端
今天 .NET 官方博客宣布 C# 9 Source Generators 第一個(gè)預(yù)覽版發(fā)布,這是一個(gè)用戶已經(jīng)喊了快 5 年特性,今天終于發(fā)布了。

[[324576]]

前言

今天 .NET 官方博客宣布 C# 9 Source Generators 第一個(gè)預(yù)覽版發(fā)布,這是一個(gè)用戶已經(jīng)喊了快 5 年特性,今天終于發(fā)布了。

簡(jiǎn)介

Source Generators 顧名思義代碼生成器,它允許開(kāi)發(fā)者在代碼編譯過(guò)程中獲取查看用戶代碼并且生成新的 C# 代碼參與編譯過(guò)程,并且可以很好的與代碼分析器集成提供 Intellisense、調(diào)試信息和報(bào)錯(cuò)信息,可以用它來(lái)做代碼生成,因此也相當(dāng)于是一個(gè)加強(qiáng)版本的編譯時(shí)反射。

使用 Source Generators,可以做到這些事情:

  • 獲取一個(gè) Compilation 對(duì)象,這個(gè)對(duì)象表示了所有正在編譯的用戶代碼,你可以從中獲取 AST 和語(yǔ)義模型等信息
  • 可以向 Compilation 對(duì)象中插入新的代碼,讓編譯器連同已有的用戶代碼一起編譯

Source Generators 作為編譯過(guò)程中的一個(gè)階段執(zhí)行:

編譯運(yùn)行 -> [分析源代碼 -> 生成新代碼] -> 將生成的新代碼添加入編譯過(guò)程 -> 編譯繼續(xù)。

上述流程中,中括號(hào)包括的內(nèi)容即為 Source Generators 所參與的階段和能做到的事情。

作用

.NET 明明具備運(yùn)行時(shí)反射和動(dòng)態(tài) IL 織入功能,那這個(gè) Source Generators 有什么用呢?

編譯時(shí)反射 - 0 運(yùn)行時(shí)開(kāi)銷

拿 ASP.NET Core 舉例,啟動(dòng)一個(gè) ASP.NET Core 應(yīng)用時(shí),首先會(huì)通過(guò)運(yùn)行時(shí)反射來(lái)發(fā)現(xiàn) Controllers、Services 等的類型定義,然后在請(qǐng)求管道中需要通過(guò)運(yùn)行時(shí)反射獲取其構(gòu)造函數(shù)信息以便于進(jìn)行依賴注入。然而運(yùn)行時(shí)反射開(kāi)銷很大,即使緩存了類型簽名,對(duì)于剛剛啟動(dòng)后的應(yīng)用也無(wú)任何幫助作用,而且不利于做 AOT 編譯。

Source Generators 將可以讓 ASP.NET Core 所有的類型發(fā)現(xiàn)、依賴注入等在編譯時(shí)就全部完成并編譯到最終的程序集當(dāng)中,最終做到 0 運(yùn)行時(shí)反射使用,不僅利于 AOT 編譯,而且運(yùn)行時(shí) 0 開(kāi)銷。

除了上述作用之外,gRPC 等也可以利用此功能在編譯時(shí)織入代碼參與編譯,不需要再利用任何的 MSBuild Task 做代碼生成啦!

另外,甚至還可以讀取 XML、JSON 直接生成 C# 代碼參與編譯,DTO 編寫(xiě)全自動(dòng)化都是沒(méi)問(wèn)題的。

AOT 編譯

Source Generators 的另一個(gè)作用是可以幫助消除 AOT 編譯優(yōu)化的主要障礙。

許多框架和庫(kù)都大量使用反射,例如System.Text.Json、System.Text.RegularExpressions、ASP.NET Core 和 WPF 等等,它們?cè)谶\(yùn)行時(shí)從用戶代碼中發(fā)現(xiàn)類型。這些非常不利于 AOT 編譯優(yōu)化,因?yàn)闉榱耸狗瓷淠軌蛘9ぷ鳎仨殞⒋罅款~外甚至可能不需要的類型元數(shù)據(jù)編譯到最終的原生映像當(dāng)中。

有了 Source Generators 之后,只需要做編譯時(shí)代碼生成便可以避免大部分的運(yùn)行時(shí)反射的使用,讓 AOT 編譯優(yōu)化工具能夠更好的運(yùn)行。

例子

INotifyPropertyChanged

寫(xiě)過(guò) WPF 或 UWP 的都知道,在 ViewModel 中為了使屬性變更可被發(fā)現(xiàn),需要實(shí)現(xiàn) INotifyPropertyChanged 接口,并且在每一個(gè)需要的屬性的 setter 處除法屬性更改事件:

  1. class MyViewModel : INotifyPropertyChanged 
  2. public event PropertyChangedEventHandler? PropertyChanged; 
  3.  
  4. private string _text; 
  5. public string Text 
  6. get => _text; 
  7. set 
  8. _text = value; 
  9. PropertyChanged?.Invoke(thisnew PropertyChangedEventArgs(nameof(Text))); 

當(dāng)屬性多了之后將會(huì)非常繁瑣,先前 C# 引入了 CallerMemberName 用于簡(jiǎn)化屬性較多時(shí)候的情況:

  1. class MyViewModel : INotifyPropertyChanged 
  2. public event PropertyChangedEventHandler? PropertyChanged; 
  3.  
  4. private string _text; 
  5. public string Text 
  6. get => _text; 
  7. set 
  8. _text = value; 
  9. OnPropertyChanged(); 
  10.  
  11. protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null
  12. PropertyChanged?.Invoke(thisnew PropertyChangedEventArgs(propertyName)); 

即,用 CallerMemberName 指示參數(shù),在編譯時(shí)自動(dòng)填充調(diào)用方的成員名稱。

但是還是不方便。

如今有了 Source Generators,我們可以在編譯時(shí)生成代碼做到這一點(diǎn)了。

為了實(shí)現(xiàn) Source Generators,我們需要寫(xiě)個(gè)實(shí)現(xiàn)了 ISourceGenerator 并且標(biāo)注了 Generator的類型。

完整的 Source Generators 代碼如下:

  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Linq; 
  4. using System.Text; 
  5. using Microsoft.CodeAnalysis; 
  6. using Microsoft.CodeAnalysis.CSharp; 
  7. using Microsoft.CodeAnalysis.CSharp.Syntax; 
  8. using Microsoft.CodeAnalysis.Text; 
  9.  
  10. namespace MySourceGenerator 
  11. [Generator] 
  12. public class AutoNotifyGenerator : ISourceGenerator 
  13. private const string attributeText = @" 
  14. using System; 
  15. namespace AutoNotify 
  16. [AttributeUsage(AttributeTargets.Field, Inherited = false, AllowMultiple = false)] 
  17. sealed class AutoNotifyAttribute : Attribute 
  18. public AutoNotifyAttribute() 
  19. public string PropertyName { get; set; } 
  20. "; 
  21.  
  22. public void Initialize(InitializationContext context) 
  23. // 注冊(cè)一個(gè)語(yǔ)法接收器,會(huì)在每次生成時(shí)被創(chuàng)建 
  24. context.RegisterForSyntaxNotifications(() => new SyntaxReceiver()); 
  25.  
  26. public void Execute(SourceGeneratorContext context) 
  27. // 添加 Attrbite 文本 
  28. context.AddSource("AutoNotifyAttribute", SourceText.From(attributeText, Encoding.UTF8)); 
  29.  
  30. // 獲取先前的語(yǔ)法接收器  
  31. if (!(context.SyntaxReceiver is SyntaxReceiver receiver)) 
  32. return
  33.  
  34. // 創(chuàng)建處目標(biāo)名稱的屬性 
  35. CSharpParseOptions options = (context.Compilation as CSharpCompilation).SyntaxTrees[0].Options as CSharpParseOptions; 
  36. Compilation compilation = context.Compilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(SourceText.From(attributeText, Encoding.UTF8), options)); 
  37.  
  38. // 獲取新綁定的 Attribute,并獲取INotifyPropertyChanged 
  39. INamedTypeSymbol attributeSymbol = compilation.GetTypeByMetadataName("AutoNotify.AutoNotifyAttribute"); 
  40. INamedTypeSymbol notifySymbol = compilation.GetTypeByMetadataName("System.ComponentModel.INotifyPropertyChanged"); 
  41.  
  42. // 遍歷字段,只保留有 AutoNotify 標(biāo)注的字段 
  43. List<IFieldSymbol> fieldSymbols = new List<IFieldSymbol>(); 
  44. foreach (FieldDeclarationSyntax field in receiver.CandidateFields) 
  45. SemanticModel model = compilation.GetSemanticModel(field.SyntaxTree); 
  46. foreach (VariableDeclaratorSyntax variable in field.Declaration.Variables) 
  47. // 獲取字段符號(hào)信息,如果有 AutoNotify 標(biāo)注則保存 
  48. IFieldSymbol fieldSymbol = model.GetDeclaredSymbol(variable) as IFieldSymbol; 
  49. if (fieldSymbol.GetAttributes().Any(ad => ad.AttributeClass.Equals(attributeSymbol, SymbolEqualityComparer.Default))) 
  50. fieldSymbols.Add(fieldSymbol); 
  51.  
  52. // 按 class 對(duì)字段進(jìn)行分組,并生成代碼 
  53. foreach (IGrouping<INamedTypeSymbol, IFieldSymbol> group in fieldSymbols.GroupBy(f => f.ContainingType)) 
  54. string classSource = ProcessClass(group.Key, group.ToList(), attributeSymbol, notifySymbol, context); 
  55. context.AddSource($"{group.Key.Name}_autoNotify.cs", SourceText.From(classSource, Encoding.UTF8)); 
  56.  
  57. private string ProcessClass(INamedTypeSymbol classSymbol, List<IFieldSymbol> fields, ISymbol attributeSymbol, ISymbol notifySymbol, SourceGeneratorContext context) 
  58. if (!classSymbol.ContainingSymbol.Equals(classSymbol.ContainingNamespace, SymbolEqualityComparer.Default)) 
  59. // TODO: 必須在頂層,產(chǎn)生診斷信息 
  60. return null
  61.  
  62. string namespaceName = classSymbol.ContainingNamespace.ToDisplayString(); 
  63.  
  64. // 開(kāi)始構(gòu)建要生成的代碼 
  65. StringBuilder source = new StringBuilder($@" 
  66. namespace {namespaceName} 
  67. {{ 
  68. public partial class {classSymbol.Name} : {notifySymbol.ToDisplayString()} 
  69. {{ 
  70. "); 
  71.  
  72. // 如果類型還沒(méi)有實(shí)現(xiàn) INotifyPropertyChanged 則添加實(shí)現(xiàn) 
  73. if (!classSymbol.Interfaces.Contains(notifySymbol)) 
  74. source.Append("public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;"); 
  75.  
  76. // 生成屬性 
  77. foreach (IFieldSymbol fieldSymbol in fields) 
  78. ProcessField(source, fieldSymbol, attributeSymbol); 
  79.  
  80. source.Append("} }"); 
  81. return source.ToString(); 
  82.  
  83. private void ProcessField(StringBuilder source, IFieldSymbol fieldSymbol, ISymbol attributeSymbol) 
  84. // 獲取字段名稱 
  85. string fieldName = fieldSymbol.Name; 
  86. ITypeSymbol fieldType = fieldSymbol.Type; 
  87.  
  88. // 獲取 AutoNotify Attribute 和相關(guān)的數(shù)據(jù) 
  89. AttributeData attributeData = fieldSymbol.GetAttributes().Single(ad => ad.AttributeClass.Equals(attributeSymbol, SymbolEqualityComparer.Default)); 
  90. TypedConstant overridenNameOpt = attributeData.NamedArguments.SingleOrDefault(kvp&nbsp;=> kvp.Key == "PropertyName").Value; 
  91.  
  92. string propertyName = chooseName(fieldName, overridenNameOpt); 
  93. if (propertyName.Length == 0 || propertyName == fieldName) 
  94. //TODO: 無(wú)法處理,產(chǎn)生診斷信息 
  95. return
  96.  
  97. source.Append($@" 
  98. public {fieldType} {propertyName}  
  99. {{ 
  100. get  
  101. {{ 
  102. return this.{fieldName}; 
  103. }} 
  104. set 
  105. {{ 
  106. this.{fieldName} = value; 
  107. this.PropertyChanged?.Invoke(thisnew System.ComponentModel.PropertyChangedEventArgs(nameof({propertyName}))); 
  108. }} 
  109. }} 
  110. "); 
  111.  
  112. string chooseName(string fieldName, TypedConstant overridenNameOpt) 
  113. if (!overridenNameOpt.IsNull) 
  114. return overridenNameOpt.Value.ToString(); 
  115.  
  116. fieldName = fieldName.TrimStart('_'); 
  117. if (fieldName.Length == 0
  118. return string.Empty; 
  119.  
  120. if (fieldName.Length == 1
  121. return fieldName.ToUpper(); 
  122.  
  123. return fieldName.Substring(01).ToUpper() + fieldName.Substring(1); 
  124.  
  125.  
  126. // 語(yǔ)法接收器,將在每次生成代碼時(shí)被按需創(chuàng)建 
  127. class SyntaxReceiver : ISyntaxReceiver 
  128. public List<FieldDeclarationSyntax> CandidateFields { get; } = new List<FieldDeclarationSyntax>(); 
  129.  
  130. // 編譯中在訪問(wèn)每個(gè)語(yǔ)法節(jié)點(diǎn)時(shí)被調(diào)用,我們可以檢查節(jié)點(diǎn)并保存任何對(duì)生成有用的信息 
  131. public void OnVisitSyntaxNode(SyntaxNode syntaxNode) 
  132. // 將具有至少一個(gè) Attribute 的任何字段作為候選 
  133. if (syntaxNode is FieldDeclarationSyntax fieldDeclarationSyntax 
  134. && fieldDeclarationSyntax.AttributeLists.Count > 0
  135. CandidateFields.Add(fieldDeclarationSyntax); 

有了上述代碼生成器之后,以后我們只需要這樣寫(xiě) ViewModel 就會(huì)自動(dòng)生成通知接口的事件觸發(fā)調(diào)用:

  1. public partial class MyViewModel 
  2. [AutoNotify] 
  3. private string _text = "private field text"
  4.  
  5. [AutoNotify(PropertyName = "Count")] 
  6. private int _amount = 5

上述代碼將會(huì)在編譯時(shí)自動(dòng)生成以下代碼參與編譯:

  1. public partial class MyViewModel : System.ComponentModel.INotifyPropertyChanged 
  2. public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; 
  3.  
  4. public string Text 
  5. get  
  6. return this._text; 
  7. set 
  8. this._text = value; 
  9. this.PropertyChanged?.Invoke(thisnew System.ComponentModel.PropertyChangedEventArgs(nameof(Text))); 
  10.  
  11. public int Count 
  12. get  
  13. return this._amount; 
  14. set 
  15. this._amount = value; 
  16. this.PropertyChanged?.Invoke(thisnew System.ComponentModel.PropertyChangedEventArgs(nameof(Count))); 

非常方便!

使用時(shí),將 Source Generators 部分作為一個(gè)獨(dú)立的 .NET Standard 2.0 程序集(暫時(shí)不支持 2.1),用以下方式引入到你的項(xiàng)目即可:

  1. <ItemGroup> 
  2. <Analyzer Include="..\MySourceGenerator\bin\$(Configuration)\netstandard2.0\MySourceGenerator.dll" /> 
  3. </ItemGroup> 
  4.  
  5. <ItemGroup> 
  6. <ProjectReference Include="..\MySourceGenerator\MySourceGenerator.csproj" /> 
  7. </ItemGroup> 

注意需要 .NET 5 preview 3 或以上版本,并指定語(yǔ)言版本為 preview :

  1. <PropertyGroup> 
  2. <LangVersion>preview</LangVersion> 
  3. </PropertyGroup> 

另外,Source Generators 需要引入兩個(gè) nuget 包:

  1. <ItemGroup> 
  2. <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="3.6.0-3.final" PrivateAssets="all" /> 
  3. <PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.0.0" PrivateAssets="all" /> 
  4. </ItemGroup> 

限制

Source Generators 僅能用于訪問(wèn)和生成代碼,但是不能修改已有代碼,這有一定原因是出于安全考量。

文檔

Source Generators 處于早期預(yù)覽階段,docs.microsoft.com 上暫時(shí)沒(méi)有相關(guān)文檔,關(guān)于它的文檔請(qǐng)?jiān)L問(wèn)在 roslyn 倉(cāng)庫(kù)中的文檔:

設(shè)計(jì)文檔

使用文檔

后記

目前 Source Generators 仍處于非常早期的預(yù)覽階段,API 后期還可能會(huì)有很大的改動(dòng),因此現(xiàn)階段不要用于生產(chǎn)。

另外,關(guān)于與 IDE 的集成、診斷信息、斷點(diǎn)調(diào)試信息等的開(kāi)發(fā)也在進(jìn)行中,請(qǐng)期待后續(xù)的 preview 版本吧。

 

責(zé)任編輯:張燕妮 來(lái)源: 博客園
相關(guān)推薦

2023-05-17 16:02:00

CSS工具代碼生成器

2021-07-23 11:24:54

Create Inc開(kāi)源G代碼生成器

2015-08-25 15:54:17

程序員代碼生成器

2022-03-10 10:48:30

PolyCoder自動(dòng)代碼生成器語(yǔ)言

2009-08-26 17:10:09

C# 3.5新特性

2025-03-17 03:00:00

C#性能并行處理

2009-08-04 09:09:51

C#反射

2025-03-07 00:12:39

2023-01-06 07:52:52

代碼生成器開(kāi)發(fā)

2009-08-19 16:51:14

C# 4.0 dyna

2009-08-27 16:24:48

擴(kuò)展方法C# 3.0新特性

2021-06-06 16:31:57

PythonPython 3.7 編程語(yǔ)言

2009-07-01 17:30:14

樣式生成器Visual Stud

2021-12-10 09:45:19

生成器配置代碼

2012-03-30 09:31:44

WEBCSS

2020-10-20 09:53:11

代碼IDEA生成器

2021-10-29 11:25:41

代碼編程語(yǔ)言Java

2025-03-28 01:05:13

2009-08-31 14:45:07

Visual C# 3

2009-05-26 09:28:22

C# 4.0dynamic動(dòng)態(tài)類型
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

中文字幕av一区二区三区高| 欧美jjzz| 欧美日韩国产首页在线观看| 综合视频免费看| 国产成人精品一区二区无码呦| 黄色av成人| 亚洲午夜国产成人av电影男同| 中文字幕日韩综合| 蜜桃麻豆影像在线观看| 中文字幕欧美国产| 国产三区精品| 国产又粗又大又爽视频| 国产一区二区高清| 久久亚洲精品成人| 老熟妇一区二区| 一区二区三区欧洲区| 91福利在线观看| 国产精品日韩三级| 在线观看av的网站| 99国产精品一区| 亚洲jizzjizz日本少妇| 波多野结衣网站| 在线看片成人| 日韩中文字幕精品视频| 一级国产黄色片| 久久久久久亚洲精品美女| 欧美性大战久久| 免费毛片小视频| 丁香花视频在线观看| 国产精品久久久99| 午夜精品美女久久久久av福利| 天天插天天干天天操| 国产盗摄女厕一区二区三区| 国产欧美亚洲精品| 日韩电影在线观看一区二区| 亚洲黄网站黄| 欧美成人高清视频| 日韩在线观看免| 欧美丝袜激情| 亚洲午夜国产成人av电影男同| 强迫凌虐淫辱の牝奴在线观看| 香蕉免费一区二区三区在线观看| 欧美喷潮久久久xxxxx| 欧美综合在线观看视频| 新版的欧美在线视频| 亚洲二区在线观看| 日本久久久网站| 色帝国亚洲欧美在线| 亚洲免费在线视频| 日本xxx免费| 国产在线高清视频| 亚洲欧洲综合另类| 日本黄xxxxxxxxx100| 日本暖暖在线视频| 亚洲视频一二区| 麻豆中文字幕在线观看| 黄色动漫在线观看| 亚洲欧美成aⅴ人在线观看| 色一情一乱一伦一区二区三区| 久久综合九色综合久| 91久色porny| 农村寡妇一区二区三区| 欧洲毛片在线| 中文字幕成人av| 在线国产99| h视频在线免费观看| 一区二区三区影院| 看全色黄大色大片| 成全电影大全在线观看| 午夜免费久久看| 日本不卡在线观看视频| 欧美成a人片在线观看久| 欧美性受极品xxxx喷水| 国产精品一区二区小说| 美女国产精品久久久| 欧美成人欧美edvon| aaaa黄色片| 久久av资源| 久久精品美女视频网站| 免费一级肉体全黄毛片| 亚洲综合二区| 国产精品中文字幕在线| 精品乱子伦一区二区| www.在线成人| 日韩欧美视频一区二区| 国产一区久久精品| 亚洲成人激情av| 成年人小视频网站| 欧美性生活一级| 亚洲精品一区二区三区精华液| 人妻无码中文久久久久专区| 日韩中文首页| 午夜免费久久久久| 中文字幕一区二区人妻| 国产.欧美.日韩| 欧美一区激情视频在线观看| h视频在线免费| 亚洲自拍欧美精品| 熟妇人妻va精品中文字幕| 国产美女视频一区二区| 精品一区二区电影| 91成人福利视频| 日欧美一区二区| 国产精品免费一区二区三区在线观看 | 亚洲av午夜精品一区二区三区| 婷婷亚洲成人| 九九热这里只有精品6| 国产女主播喷水视频在线观看| 国产精品一卡二卡| 日本一区二区三区免费观看| 国产理论电影在线| 欧美高清激情brazzers| 精品人妻一区二区三区香蕉 | 欧美激情一区二区三区成人| 国产99久久久久久免费看| 丁香啪啪综合成人亚洲小说 | 国产精品vip| 国产精品欧美亚洲777777| 日本精品一二区| 亚洲美女区一区| 亚洲精品久久久久久宅男| 午夜欧洲一区| 韩国三级电影久久久久久| 国产精品无码免费播放| 亚洲国产电影在线观看| 欧美牲交a欧美牲交aⅴ免费真| 麻豆精品在线| 久久人人爽人人爽人人片亚洲| 久久久久久久久久成人| 91碰在线视频| 婷婷五月综合缴情在线视频| 欧美激情三级| 美女福利精品视频| 国产又黄又大又粗的视频| 亚洲国产成人午夜在线一区 | 日韩精品一区二区在线播放| 国产精品一区二区你懂的| 影音先锋欧美在线| 在线播放成人| 久久精品电影网站| 亚洲天堂视频网| 国产精品久久久久久久久快鸭| 日本熟妇人妻中出| 欧美日韩激情| 国产精品久久久久久久app| 久久99久久| 色婷婷激情久久| 好吊日免费视频| 久久久久国产精品午夜一区| 日本午夜精品一区二区| 欧美va视频| 尤物yw午夜国产精品视频| 亚洲成人av网址| 中文字幕 久热精品 视频在线| 8x8x最新地址| 先锋资源久久| 国产成人精品一区二区三区福利| 国产乱妇乱子在线播视频播放网站| 精品少妇一区二区三区在线播放| 国产在线视频99| av资源站一区| 国产精品拍拍拍| 97精品视频在线看| 不卡视频一区二区三区| gratisvideos另类灌满| 亚洲摸下面视频| 欧美 亚洲 另类 激情 另类| 国产精品第四页| 成年人看片网站| 国产视频一区欧美| 色女人综合av| 久久免费福利| 26uuu亚洲伊人春色| 国产三级视频在线播放线观看| 欧美日韩精品一区二区三区蜜桃 | 91免费精品国偷自产在线| av网站免费在线观看| 精品国产免费一区二区三区香蕉 | 大香伊人中文字幕精品| 日韩精品欧美国产精品忘忧草 | 99久久伊人| 欧美成人精品一区| 亚洲欧美日韩精品永久在线| 欧美在线短视频| 久久r这里只有精品| 91视频免费观看| 欧美丝袜在线观看| 国产精品亚洲综合久久| 亚洲日本无吗高清不卡| 风间由美性色一区二区三区四区| 国产成人福利网站| 最新日本在线观看| 亚洲午夜小视频| 懂色av成人一区二区三区| 日本电影亚洲天堂一区| 欧美三级免费看| 亚洲国产精品成人综合| 亚洲av成人无码一二三在线观看| 麻豆高清免费国产一区| 色欲色香天天天综合网www| 日韩a一区二区| 国产在线精品二区| 成人噜噜噜噜| 国产精品国产福利国产秒拍| 国产盗摄一区二区| 日韩一区二区三区在线播放| 日韩精品福利| 亚洲白虎美女被爆操| 国产乱淫片视频| 在线观看亚洲精品视频| 免费日韩一级片| 亚洲精品国产精华液| 黄色一级片一级片| 久久精品亚洲精品国产欧美| www.17c.com喷水少妇| 精品一区二区三区久久久| 老熟妇仑乱视频一区二区| 亚洲人人精品| 免费视频爱爱太爽了| 99久久久久久中文字幕一区| 欧洲精品码一区二区三区免费看| 国产精品网在线观看| 成人午夜激情免费视频| 97成人超碰| 国产成人鲁鲁免费视频a| 激情视频网站在线播放色| 欧美日韩aaaa| 亚洲区欧洲区| 美日韩丰满少妇在线观看| 日本在线视频网| 神马国产精品影院av| 国产在线视频网址| 亚洲日韩欧美视频| 亚洲aⅴ乱码精品成人区| 亚洲成成品网站| 亚洲国产成人一区二区| 日韩欧美色电影| 国产同性人妖ts口直男| 666欧美在线视频| 国产乱淫av免费| 91精品国产综合久久国产大片| 91精品国产乱码久久久久| 欧美日韩美少妇| 中文字幕第一页在线播放| 欧美视频在线播放| 亚洲特级黄色片| 欧美一区二区三区免费大片| 国产区精品在线| 欧美成人高清电影在线| 成人免费公开视频| 亚洲国产精品久久久久久| 天堂av中文字幕| 精品小视频在线| 黑人与亚洲人色ⅹvideos| 中国人与牲禽动交精品| 天天在线视频色| 欧美成人高清视频| 2020国产在线| 日本成熟性欧美| 成人午夜毛片| 亚洲xxxx18| 福利电影一区| 超碰97在线资源| 日韩影视高清在线观看| 日韩精品成人一区二区在线观看| 手机在线电影一区| 国产一区二区三区乱码| 在线一区免费观看| 久久婷五月综合| 国产不卡一区视频| 亚洲天堂久久新| 亚洲欧洲日韩综合一区二区| 久久国产在线视频| 色综合色狠狠综合色| 亚洲字幕av一区二区三区四区| 欧美一区二区精美| 亚洲aaaaaaa| 精品国产一区久久久| 国模雨婷捆绑高清在线| 国产999在线| 欧美影院精品| 欧美精品亚洲精品| 正在播放日韩欧美一页| 干日本少妇首页| 激情欧美一区二区三区在线观看| 香蕉视频污视频| 中文字幕免费一区| 日本在线视频免费观看| 欧美日韩日日摸| 人妻一区二区三区| 色先锋资源久久综合5566| 久久香蕉av| 国产伦精品免费视频| 久草在线综合| 日本xxx免费| 日韩av电影免费观看高清完整版| 麻豆免费在线观看视频| 欧美国产精品劲爆| 亚洲欧美在线视频免费| 欧美日韩国产小视频在线观看| 亚洲欧美综合一区二区| 色一区av在线| 性欧美videohd高精| 国产精品对白刺激久久久| 日韩电影免费网站| 国产男女无遮挡| 成人国产免费视频| 夫妻性生活毛片| 在线观看欧美黄色| 香蕉人妻av久久久久天天| 美日韩精品视频免费看| 91成人在线| 久久综合九色综合网站| 国色天香一区二区| 亚洲一区二区福利视频| 国产欧美精品日韩区二区麻豆天美| 日韩免费一二三区| 日韩女同互慰一区二区| 日本免费视频在线观看| 国产精品久久综合av爱欲tv| 国内精品免费| 亚洲精品蜜桃久久久久久| 国产在线不卡一区| 美女网站视频色| 在线观看免费亚洲| 麻豆影视在线| 茄子视频成人在线| 色爱综合av| 欧美日韩性生活片| 成人免费视频一区| 精品少妇theporn| 欧美大片免费久久精品三p| www.久久久久.com| 97影院在线午夜| 欧美日韩国产探花| 伊人av在线播放| 亚洲乱码国产乱码精品精98午夜 | 国产无限制自拍| 粉嫩av一区二区三区| 免费一级a毛片夜夜看| 日韩精品一区二区在线观看| aaa大片在线观看| av一区二区三区免费| 狠狠色丁香久久综合频道| 韩国av中国字幕| 亚洲成人av免费| 婷婷开心激情网| 欧美中文字幕精品| 国产欧美日韩一区二区三区四区| 丰满少妇在线观看| 国产精品美女久久久久久2018 | 精品第一国产综合精品aⅴ| 欧美videosex性欧美黑吊| 国产精品jizz视频| 999亚洲国产精| 美女久久久久久久久久| 日韩一二三在线视频播| 开心激情综合网| 97超碰蝌蚪网人人做人人爽| 丝袜美腿综合| 免费无码国产v片在线观看| 91色九色蝌蚪| 久久久久在线视频| 中文字幕综合一区| 成人污污视频| 可以看毛片的网址| 久久综合999| 亚洲 小说区 图片区| 久久精品国产一区二区电影| 91成人在线精品视频| 每日在线更新av| 中文字幕va一区二区三区| 99产精品成人啪免费网站| 国语自产精品视频在线看一大j8| 亚洲精品白浆高清| 波多野结衣xxxx| 一区二区三区中文字幕电影| 性xxxxbbbb| 国产欧美日韩中文字幕| 欧美日韩亚洲一区三区| 亚洲国产无码精品| 欧美久久久久免费| 成人免费高清观看| 亚洲精品欧洲精品| 国产91丝袜在线播放0| 日本a级c片免费看三区| 久久国产精品亚洲| 免费久久精品| 日本亚洲一区二区三区| 欧美日韩亚洲视频| gogogogo高清视频在线| 日韩动漫在线观看| 国产91富婆露脸刺激对白| 国产在线一级片| 久久久噜久噜久久综合| 日韩在线观看一区| 波多野结衣av在线免费观看| 欧美精品一二三四| 日韩欧美看国产| 国产一二三区在线播放|