使用C#创建Firebase规则时出现System.NullReferenceException如何修复?
问题
我为Firebase规则服务创建了认证函数,并调用服务实例来创建Firebase规则集,但返回错误:System.NullReferenceException: Object reference not set to an instance of an object。拆分对象后,空引用异常出现在创建Source实例的代码行。
原始代码
using Google.Apis.FirebaseRules.v1; using Ruleset = Google.Apis.FirebaseRules.v1.Data.Ruleset; using Source = Google.Apis.FirebaseRules.v1.Data.Source; using File = Google.Apis.FirebaseRules.v1.Data.File; private static FirebaseRulesService _firebaseRulesService; public static void IntializeFirebaseRules() { GoogleCredential credential = GoogleCredential.GetApplicationDefault(); if (CloudManager.Credential.IsCreateScopedRequired) { credential = CloudManager.Credential.CreateScoped(FirebaseRulesService.Scope.CloudPlatform); } _firebaseRulesService = new FirebaseRulesService( new BaseClientService.Initializer() { HttpClientInitializer = credential, ApplicationName = CloudManager.ApplicationName }); } public static async void AddRuleset() { Ruleset myRuleset = new Ruleset { new Source { Files = { new File { Name = "firestore.rules", Content = "service cloud.firestore {" + "match /databases/{database}/documents {" + "match /users/{userId}{" + "allow read: if (request.auth.uid == userId);" + "}" + "match /licenses/{accountId} {" + "allow read: if isAccountOwner(accountId);" + "}" + "}"+"}", } } }; }; _firebaseRulesService.Projects.Rulesets.Create(myRuleset , "projects/" + CloudManager.ProjectId); }
修改后的代码(异常出现在Source实例创建行)
File myFile = new File { Name = "firestore.rules", Content = "service cloud.firestore {" + "match /databases/{database}/documents {" + "match /users/{userId}{" + "allow read: if (request.auth.uid == userId);" + "}" + "function doc(subpath) {" + "return get(/databases/$(database)/documents/$(subpath)).data;" + "}" + "function isAccountOwner(accountId) {" + "return request.auth.uid == accountId" + "|| doc(/users/$(request.auth.uid)).accountId == accountId;" + "}" + "match /licenses/{accountId} {" + "allow read: if isAccountOwner(accountId);" + "}" + "}"+"}", }; Source mySource = new Source { Files = { myFile } }; Ruleset myRuleset = new Ruleset { Source = mySource }; _firebaseRulesService.Projects.Rulesets.Create(myRuleset , "projects/" + CloudManager.ProjectId);
解决方案
空引用异常的核心原因是**Source类的Files集合未被初始化**。在C#中使用集合初始化语法(Files = { myFile })时,要求集合本身已经被实例化,否则会触发空引用错误。
具体修复步骤:
显式初始化
Files集合
创建Source实例时,先将Files初始化为新的List<File>实例,再添加文件对象:Source mySource = new Source { Files = new List<File> { myFile } };排查其他潜在空引用点
- 确保
_firebaseRulesService已通过IntializeFirebaseRules()方法正确初始化,避免调用Create接口时服务实例为空。 - 验证
CloudManager.ProjectId不为空或空字符串,保证请求的项目ID合法有效。
- 确保
修正原始代码的语法错误
原始代码中Ruleset初始化器存在语法错误,直接嵌套new Source不符合C#对象初始化规则,正确写法应为给Ruleset的Source属性赋值:Ruleset myRuleset = new Ruleset { Source = new Source { Files = new List<File> { new File { Name = "firestore.rules", Content = "// 规则内容..." } } } };规范异步方法写法
AddRuleset声明为async void仅适用于事件处理程序,建议改为async Task以支持异步等待和错误捕获,同时调用ExecuteAsync()执行异步请求:public static async Task AddRuleset() { // 代码逻辑... await _firebaseRulesService.Projects.Rulesets.Create(myRuleset, "projects/" + CloudManager.ProjectId).ExecuteAsync(); }
内容的提问来源于stack exchange,提问作者Samaritan
相关产品推荐
相关产品推荐

