Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 39 additions & 10 deletions src/RoslynTestKit/Helpers/AdhocWorkspace.cs
Original file line number Diff line number Diff line change
Expand Up @@ -107,19 +107,48 @@ private static ProjectInfo CreateProjectInfoViaReflection(string name, string la
var args = new object?[parameters.Length];

// The first 5 parameters are always: id, version, name, assemblyName, language (required)
// All other parameters are optional and will use Type.Missing to get their default values
// All other parameters are optional - use their default values via ParameterInfo.DefaultValue
for (int i = 0; i < parameters.Length; i++)
{
var paramName = parameters[i].Name?.ToLowerInvariant();
args[i] = paramName switch
var param = parameters[i];
var paramName = param.Name?.ToLowerInvariant();

// Handle the 5 required parameters explicitly
if (paramName == "id")
{
args[i] = ProjectId.CreateNewId();
}
else if (paramName == "version")
{
args[i] = VersionStamp.Create();
}
else if (paramName == "name")
{
args[i] = name;
}
else if (paramName == "assemblyname")
{
args[i] = name;
}
else if (paramName == "language")
{
args[i] = language;
}
// For optional parameters, use their default value or appropriate fallback
else if (param.HasDefaultValue)
{
args[i] = param.DefaultValue;
}
else if (!param.ParameterType.IsValueType)
{
// Reference types without default - use null
args[i] = null;
}
else
{
"id" => ProjectId.CreateNewId(),
"version" => VersionStamp.Create(),
"name" => name,
"assemblyname" => name,
"language" => language,
_ => Type.Missing // Use default value for optional parameters
};
// Value types without default - use default(T)
args[i] = Activator.CreateInstance(param.ParameterType);
}
}

var result = _cachedCreateMethod.Invoke(null, args);
Expand Down
Loading